【问题标题】:Django Form validation error (Select a valid choice) when use "queryset=Product.objects.none()"使用“queryset=Product.objects.none()”时出现 Django 表单验证错误(选择一个有效选项)
【发布时间】:2021-11-26 15:57:27
【问题描述】:

我在收到产品订单时使用 formset_factory

product_formset = formset_factory(OrderProductsForm,extra=5)

当我在“OrderProductsForm(forms.ModelForm):”中使用 “qeryset=Product.objects.all()” 时它起作用了

self.fields['product'] = ModelChoiceField(queryset=Product.objects.all(),empty_label="Ürün Seciniz", widget=forms.Select(attrs={"onChange":'stokKontrol(this.value,this.id)'}))

但它会获取所有产品,因此页面加载时间会增加。 我想使用 “queryset=Product.objects.none()” 但那时当我在 view.py 中检查表单时

    if request.method == "POST":
        formset = product_formset(request.POST)
        if formset.is_valid():

得到一个错误 “选择一个有效的选项。该选择不是可用的选择之一。” 你有什么建议吗?谢谢

Forms.py

class OrderProductsForm(forms.ModelForm):
    class Meta:
        model = OrderProducts
        fields = ['amount']

    def __init__(self, *args, **kwargs):         
        super(OrderProductsForm, self).__init__(*args, **kwargs)
        self.fields['product_category'] = ModelChoiceField(queryset=ProductCategory.objects.all(),empty_label="Ürün Grubunu seciniz",
                                    widget=forms.Select(attrs={"onChange":'myFunction(this.value,this.id)'}))
        
        #self.fields['product'] = ModelChoiceField(queryset=Product.objects.all(),empty_label="Ürün Seciniz", widget=forms.Select(attrs={"onChange":'stokKontrol(this.value,this.id)'}))
        self.fields['product'] = ModelChoiceField(queryset=Product.objects.none() ,empty_label="Ürün Seciniz",required=False,widget=forms.Select(attrs={"onChange":'stokKontrol(this.value,this.id)'}))
                                    
        self.fields['stok'] = forms.CharField(required=False,disabled=True,max_length=5)

【问题讨论】:

    标签: python django forms


    【解决方案1】:

    相信你误解了objects.none()的用法。请参阅here 以获得很好的解释。

    Product.objects.none() - 这最初只是表示一个空对象,用于不同的用例。当您将其设置为查询集时,您会将查询集初始化为空。

    错误

    选择一个有效的选项。该选择不是可用的选择之一。

    是预期的,因为这不是查询集的可用选择。为了加快其他方法的增加,我建议查看其他属性以加快过滤时间。 This 是避免每次通过使用django-cache 重新加载的可能解决方案。

    【讨论】:

    • 感谢您的回答 @AzyCrw4282,我使用 javascript 创建产品列表,所以我必须编写 Product.objects.none() 因为它不能是 ModelChoiceField 中的空白查询集,因为我知道。但我尝试使用 django-cache。
    猜你喜欢
    • 2020-04-14
    • 2018-04-30
    • 2018-08-13
    • 2015-04-05
    • 2012-05-13
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    相关资源
    最近更新 更多