Django form выпадающий список сохраненных моделей
Я пытаюсь создать форму для библиотеки, где пользователь может выполнить 2 действия: добавить новую книгу или открыть сохраненную информацию о существующем. У книг есть 2 поля (название и автор).
Каждый раз, когда создается новая книга, она сохраняется в базе данных. Любая ранее созданная книга отображается как опция в раскрывающемся списке (только имя). Я хочу, чтобы, когда пользователь выбирает параметр из раскрывающегося списка, на экране появляется информация о выбранной книге.
Я пытался использовать два разных подхода, но ни один из них не соответствует моим требованиям.
С одной стороны, после этого вопроса раскрывающийся список номеров django form Я могу создать раскрывающийся список и получить выбранное значение в представлениях с некоторым кодом:
class CronForm(forms.Form):
days = forms.ChoiceField(choices=[(x, x) for x in range(1, 32)])
def manage_books(request):
d = CronForm()
if request.method == 'POST':
day = request.POST.get('days')
Но я хочу, чтобы мои параметры были ранее сохраненными книгами в базе данных, а не предварительно определенными значениями.
Другой подход, который я попытался сделать, - это сделать из html-шаблона. Там я создаю следующую форму:
<form>
{% for book in list %}
<option value="name">{{ book.name }}</option>
{% endfor %}
</form>
Если книга отображается в виде:
l = Books.objects.all().order_by('name')
В этом втором случае информация, отображаемая в раскрывающемся списке, является той, которую я хочу, но я не знаю, как получить выбранное значение и использовать его в представлениях. Возможно, используя функцию javascript?
Итак, мои 2 требования: показать правильную информацию в списке (сохраненную в БД пользователем) и узнать, какой из них выбран.
Ответы
Ответ 1
Вы должны использовать ModelChoiceField.
class CronForm(forms.Form):
days = forms.ModelChoiceField(queryset=Books.objects.all().order_by('name'))
Затем ваши взгляды должны выглядеть примерно так:
def show_book(request):
form = CronForm()
if request.method == "POST":
form = CronForm(request.POST)
if form.is_valid:
#redirect to the url where you'll process the input
return HttpResponseRedirect(...) # insert reverse or url
errors = form.errors or None # form not submitted or it has errors
return render(request, 'path/to/template.html',{
'form': form,
'errors': errors,
})
Чтобы добавить новую книгу или изменить ее, вы должны использовать ModelForm. Тогда в этом представлении вы проверите, будет ли это новая форма или нет
book_form = BookForm() # This will create a new book
или
book = get_object_or_404(Book, pk=1)
book_form = BookForm(instance=book) # this will create a form with the data filled of book with id 1