存储模型的Django的形式下拉列表(django form dropdown list of st

2019-08-31 09:22发布

我想创建一个表单,用户可以在执行2点的操作库:添加一本新书或打开一个现有的存储的信息。 图书有2场(标题和作者)。 每次一本新书被创建时,它被存储在数据库中。 以前创建的任何书显示为在下拉列表(只有名称)的选项。 我想,当用户从下拉列表中选择选项,屏幕上会显示所选书的信息。

我一直在尝试2种不同的方法,但他们都不符合我的要求。 一方面,关注此问题的数字Django的形式下拉列表中我能够在有这样的一些代码视图以创建一个下拉列表,并获得选择的值:

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级的要求是:显示在列表(由用户存储在DB)的正确的信息,并能知道哪一个已被选择。

Answer 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


文章来源: django form dropdown list of stored models