【问题标题】:ModelChoiceFilter gives "Select a valid choice. That choice is not one of the available choices." when submittedModelChoiceFilter 给出“选择一个有效的选择。该选择不是可用的选择之一。”提交时
【发布时间】:2020-11-20 23:05:43
【问题描述】:

我正在使用 django-filters 根据 brand 过滤我的 products。当我提交表单时,我得到“选择一个有效的选择。该选择不是可用的选择之一。”我使用 ModelChoiceFilter 因为文档说它适合 ForeignKey 关系。

按照 product.html 的预期,表单成功呈现为复选框:

form successfully rendered

When form is submitted with checkboxes selected, error arises:

ModelChoiceFilter gives error

令人惊讶的是,当我将过滤器更改为 ModelMultipleChoiceFilter 时,我没有得到“选择一个有效的选择。该选择不是可用的选择之一。”错误。我想知道为什么 ModelChoiceFilter 会抛出这个错误。

这是我的代码:

models.py

class Brand(models.Model):

    bool_choices = (
        (True, 'Yes'),
        (False, 'No'),
    )
    
    name = models.CharField(max_length=30)

    def __str__(self):
        return f"{self.name}"

class Product(MPTTModel):

    parent = TreeForeignKey('self',  blank = True, null = True, related_name = 'children', on_delete=models.CASCADE)
    name = models.CharField(max_length=50)
    brand = models.ForeignKey(Brand, on_delete=models.CASCADE, related_name="brand") #one to many relationship between Brand and Product class
    category = TreeManyToManyField(Category, blank = True)

filters.py

import django_filters
from product.models import Product, Category, Brand
from django.db import models
from django import forms

       
class BrandFilter(django_filters.FilterSet):

    brand = django_filters.ModelChoiceFilter(queryset= Brand.objects.all(), widget=forms.CheckboxSelectMultiple, empty_label = None, to_field_name = 'name')

    class Meta:
        model = Product 
        fields = ('brand',) 

views.py

def product(request):

    products = Product.objects.all()
    brandFilter = BrandFilter(request.GET, queryset= products )

    products = brandFilter.qs
    

    context = {'products':products,'brandFilter': brandFilter}
    return render(request, 'home/product.html', context)


product.html

...
<div>
    <form method = "get">
        {{ brandFilter.form.as_p }}
        <button class="btn btn-primary" type="submit"> Search </button>
    </form>
</div>

<div>
    {% for product in products %}
        <div>
            {{ product }}

        </div>
    {% endfor %}
</div>

我已尝试在激活 1 个复选框的情况下提交表单,但错误仍然存​​在: Error still arises with 1 checkbox activated

【问题讨论】:

    标签: python django django-forms django-filter


    【解决方案1】:

    ModelChoiceFilter 只允许单选,因为它使用django.forms.models.ModelChoiceField 代替validating selected values

    但是,您使用forms.CheckboxSelectMultiple 小部件对其进行了实例化。 这意味着选择的值作为列表传递,this line 执行为

    value = self.queryset.get(**{name: [<selected_value>,...]})
    

    并引发self.queryset.model.DoesNotExist 异常。

    如果您希望为一个产品选择多个品牌(即一个产品有多个品牌),则要使用的过滤器是ModelMultipleChoiceFilter,它使用ModelMultipleChoiceFieldvalidates against a list of values

    否则,要保持产品和品牌之间的一对一关系并在表单中反映这一点,请使用选择单个值的表单小部件,例如 RadioSelectSelect

    【讨论】:

    • 您好,感谢您的帮助!我现在有点明白了? 0 "ModelChoiceFilter 只允许单个选择,因为它使用 django.forms.models.ModelChoiceField 来验证所选值。"我提交了仅激活了 1 个复选框的表单,但仍然出现错误(请参见上面添加的图像)。实际上,品牌与产品是一对多的关系,一个品牌可以有很多产品。我使用此过滤器的目标是执行“AND”操作,如果我选择了 2 个品牌复选框,我的程序应返回与这些品牌相关的任何产品。
    猜你喜欢
    • 1970-01-01
    • 2012-01-22
    • 2018-06-11
    • 2021-04-12
    • 1970-01-01
    • 2017-12-30
    • 2020-10-30
    • 2014-06-24
    • 2016-05-18
    相关资源
    最近更新 更多