Skip to main content
 首页 » 编程设计

python之没有项目匹配给定的查询 : dropdown options in Django

2025年05月04日30qq78292959

我问了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/

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