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