我问了this问题较早,但现在我无法弄清楚如何为多表单 View 的一种表单使用下拉菜单(或者更好的是自动填充字段)。
正在使用的模型是 Book、BookDetails 和 Genre。 BookDetails 是流派(和其他类似表)的链接表,这样我就可以拥有流派等的静态列表,其中包含 BookDetails 的唯一 ID 和外键。
现在我有这个:
#views.py
def BookFormView(request):
genre = Genre.objects.all()
if request.method == "POST":
book_form = BookForm(request.POST, prefix='book')
bookdetails_form = BookDetailsForm(request.POST, prefix='bookdetails')
selected_genre = get_object_or_404(Genre, pk=request.POST.get('genre_id'))
genre.id = selected_genre
genre.save()
if book_form.is_valid() and bookdetails_form.is_valid():
book_form.save()
bookdetails_form.save()
return HttpResponseRedirect("/books/")
else:
book_form = bookForm(prefix='book')
bookdetails_form = BookDetailsForm(prefix='bookdetails)
return render(request, 'books/createbook.html',
{'book_form' : book_form,
'bookdetails_form': bookdetails_form,
'genre':genre,})
#createbook.html
<select name="genre", id="genre" form="bookform">
{% for entry in genre %}
<option value="{{ entry.id }}">
{{ entry.name }}
</option>
{% endfor %}
</select>
表单在页面上正确显示,下拉菜单包含来自数据库的选项。但是,当我点击提交将信息存储到数据库时,我收到一条错误消息,提示 No Genre matches the given query 其他关于此错误的帖子似乎不是来自同一上下文.我认为这可能与选择名称但存储 id(用于流派)有关,但除此之外我不知所措。
请您参考如下方法:
通常,在 django 中使用表单执行此操作的方式不是手动从 POST 字典中提取内容,而是使用 ModelChoiceField:
https://docs.djangoproject.com/en/1.8/ref/forms/fields/#modelchoicefield
您没有这样做有什么具体原因吗?
另外,对于两个不同的事情,您似乎错误地使用了 genre 变量。您使用查询集对其进行初始化,然后在代码后面尝试将其视为 Genre 实例。这会导致问题,更不用说我认为您的 genre.id = ... 行不会按照您的预期进行。
此外,对函数名称使用标题大小写也违反了样式约定。如果您要使用 Python 进行大量编码,那么可能值得在此处查看官方接受的 PEP8 样式指南:
https://www.python.org/dev/peps/pep-0008/
代码中还有一些其他问题,但我不确定是否值得指出来。
