【问题标题】:Queryset in __init__ Form Django__init__ 表单 Django 中的查询集
【发布时间】:2018-06-01 18:21:46
【问题描述】:
class PaymentSelectForm(forms.Form):   
    date_from = forms.DateField()
    date_to = forms.DateField()
    website = ModelChoiceField() 
    paymentmethod = forms.ChoiceField(choices=PAYCODE_CHOICES)

    def __init__(self, *args, **kwargs):
        super(PaymentSelectForm, self).__init__(*args, **kwargs)
        applyClassConfig2FormControl(self) 
        self.fields['website'].queryset=Website.objects.all()

我有错误:TypeError:__init__() 缺少 1 个必需的位置参数:'queryset'。如何在__init__ 表单中使用Queryset

【问题讨论】:

  • 我不明白你为什么要在__init__ 中这样做,而不是在字段本身的构造中?
  • 这是 django-admin 表单吗?还是简单的?
  • 使用 forms.ModelForm 而不是 forms.Form。
  • @AnupYadav: 但是错误是由ModelChoiceField 构造引起的,所以无论我们使用什么类型的Form,它都会总是错误,因为我们从不构造PaymentSelectForm 班级。

标签: python django forms


【解决方案1】:

除非您当前隐藏了某些信息,否则您最好ModelChoiceField的声明中声明查询集

class PaymentSelectForm(forms.Form):

    date_from = forms.DateField()
    date_to = forms.DateField()
    website = ModelChoiceField(queryset=Website.objects.all()) 
    paymentmethod = forms.ChoiceField(choices=PAYCODE_CHOICES)

    def __init__(self, *args, **kwargs):
        super(PaymentSelectForm, self).__init__(*args, **kwargs)
        applyClassConfig2FormControl(self)

如果查询集是动态的(这里不是这种情况),您可以将其初始设置为None,然后将其覆盖在@987654324 @函数:

class PaymentSelectForm(forms.Form):

    date_from = forms.DateField()
    date_to = forms.DateField()
    website = ModelChoiceField(queryset=None) 
    paymentmethod = forms.ChoiceField(choices=PAYCODE_CHOICES)

    def __init__(self, *args, **kwargs):
        super(PaymentSelectForm, self).__init__(*args, **kwargs)
        applyClassConfig2FormControl(self)
        self.fields['website'].queryset=Website.objects.all()

但是,如果queryset 依赖于传递给表单的参数,或者它依赖于其他表(并且不能优雅地写入 SQL 查询),则通常是这种情况。

【讨论】:

    【解决方案2】:

    使用widget.choices

    def __init__(self, *args, **kwargs):
            super(PaymentSelectForm, self).__init__(*args, **kwargs)
            applyClassConfig2FormControl(self) 
            self.fields['website'].widget.choices=(
                (choice.pk, choice) for choice in Website.objects.all()
            )
    

    【讨论】:

      猜你喜欢
      • 2013-12-06
      • 2013-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多