【问题标题】:Django modelformset_factory() filteringDjango modelformset_factory() 过滤
【发布时间】:2013-06-19 17:04:28
【问题描述】:

我需要从查询中过滤掉大量对象。目前,它正在抓取类中的所有对象,我想将其过滤到查询字符串中的相关对象。我怎样才能做到这一点?当我尝试时,我得到一个属性错误说明

''QuerySet' object has no attribute '__name__'.'

有效但速度很慢的代码是:

formset = modelformset_factory(Transaction, form=PaidDateForm, extra=0, can_delete=False)

还有,表单集:

formset = formset(request.POST, Transaction.objects.filter(pk__in=qs))

我要过滤的 QueryString 称为“qs”。

class PaidDateForm(forms.ModelForm):
    formfield_callback = jquery_datefield
Amount",max_digits=14,decimal_places=2,required=False)
    date_cleared = forms.DateField(label="Cleared Date",widget=JQueryDateWidget(), input_formats=settings.DATE_INPUT_FORMATS, required=False)

    class Meta:
        model = Transaction
        include = ('date_time_created')

    def __init__(self, *args, **kwargs):
        self.queryset = Transaction.objects.filter(pk__in=qs)
        super(PaidDateForm, self).__init__(*args, **kwargs)
        for field in self.fields:
            if field != 'date_cleared':
                self.fields[field].widget = forms.HiddenInput()
        self.fields['paid_amount'].widget.attrs['size'] = 12
        self.initial['paid_amount'] = '%.2f' % (self.instance.usd_amount)

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    查看 Django 文档中的示例: https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#changing-the-queryset

    如果我正确理解您的问题,有两种方法可以解决您的问题:

    第一:

    TransactionFormset = modelformset_factory(Transaction,form=PaidDateForm, extra=0, can_delete=False)
    formset = TransactionFormset(queryset=Transaction.objects.filter(pk__in=qs))
    

    第二个选项是创建 BaseTransactionFormset

    class BaseTransactionFormSet(BaseModelFormSet):
        def __init__(self, *args, **kwargs):
            super(BaseTransactionFormSet, self).__init__(*args, **kwargs)
    
            #create filtering here whatever that suits you needs
            self.queryset = Transaction.objects.filter()
    
    formset = modelformset_factory(Transaction, formset=BaseTransactionFormSet,form=PaidDateForm, extra=0, can_delete=False)
    

    这段代码对你有帮助吗?

    【讨论】:

    • 我之前尝试在我的表单 PaidDateForm() 中定义查询集,但得到一个 NameError 'global name 'qs' is not defined。该表格现已添加到我的原始帖子中:
    【解决方案2】:

    我犹豫你是否仍然需要它,但这段代码对我有用

    FormSet =  modelformset_factory(YourModel, fields=(...))
    form_set = FormSet(queryset = YourModel.objects.filter(...))
    

    【讨论】:

      猜你喜欢
      • 2018-12-14
      • 2019-04-01
      • 1970-01-01
      • 2011-12-18
      • 2014-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多