【问题标题】:No Item matches the given query: dropdown options in Django没有项目与给定的查询匹配:Django 中的下拉选项
【发布时间】:2015-05-20 18:33:40
【问题描述】:

我之前问过this 的问题,但现在我无法弄清楚如何为多表单视图的一种形式使用下拉菜单(甚至更好的是自动填充字段)。

使用的模型是 Book、BookDetails 和 Genre。 BookDetails 是一个到 Genre(和其他类似表)的链接表,因此我可以拥有一个静态的流派列表等,其中包含 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 SO 上有关此错误的其他帖子似乎并非来自同一上下文。我认为这可能与选择名称但存储 id(用于流派)有关,否则我不知所措。

【问题讨论】:

  • @Wtower 这可能是你的胡同

标签: python django psql


【解决方案1】:

通常,在 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/

代码中还有一些其他问题,但我不确定是否值得指出这些问题。

【讨论】:

  • 很好的反馈,谢谢。看起来我绝对应该使用 ModelChoiceFieldl 我会看看样式指南,然后用正确的词汇报告回来,说出我正在尝试做的事情。
  • @Nancy 我对风格指南的唯一看法是说def BookFormView... 应该是def book_form_view...。此外,如果您觉得我的回答解决了您的问题,您应该单击它旁边的复选框以接受它和/或单击向上箭头进行投票。
  • 这当然很有帮助,但我的代码还是一样的。我正在使用您提到的资源,但我还不能确定我的问题是否已解决。
猜你喜欢
  • 2015-03-25
  • 1970-01-01
  • 2019-09-05
  • 2017-03-08
  • 2019-02-28
  • 1970-01-01
  • 1970-01-01
  • 2016-01-31
  • 2014-05-04
相关资源
最近更新 更多