Django 如何覆盖 inlineformset_factory 中的子表单

标签 django inline-formset

我正在尝试覆盖子表单中的概念查询集,以根据从 request.POST 获取的区域获取自定义列表概念,这是我的概念列表,我需要根据 POST 请求进行过滤,这个列表是我的子表单(InvoiceDetail)的一个fk。可以有这些过滤器吗?

List of concepts

当我按照文档所述传递初始数据initial=['concept'=queryset_as_dict]进行一些测试后,它总是返回所有概念,但我在 View 中打印相同的内容过滤器可以,但是当我在模板中渲染时就不行了,所以我读到我需要使用一些 BaseInlineFormset。所以当我测试时我得到了不同的错误:

django.core.exceptions.ValidationError: ['ManagementForm data is missing or has been tampered with']
'InvoiceDetailFormFormSet' object has no attribute 'fields'

所以这是我的代码: 模型.py

class ConceptDetail(CreateUpdateMixin): # here, is custom list if area='default' only returns 10 rows. 
    name = models.CharField(max_length=150)
    area = models.ForeignKey('procedure.Area')

class Invoice(ClusterableModel, CreateUpdateMixin): # parentForm
    invoice = models.SlugField(max_length=15)

class InvoiceDetail(CreateUpdateMixin):  # childForm
    tax = models.FloatField()
    concept = models.ForeignKey(ConceptDetail, null=True, blank=True) # fk to override using custom queryset
    invoice = models.ForeignKey('Invoice', null=True, blank=True)

View .py

class CreateInvoiceProcedureView(LoginRequiredMixin, PermissionRequiredMixin, CreateView):
    template_name = 'invoice/invoice_form.html'
    model = Invoice
    permission_required = 'invoice.can_check_invoice'
        def post(self, request, *args, **kwargs):
    self.object = None
    form = InvoiceForm(request=request)
    # initial initial=[{'tax': 16, }] removed
    invoice_detail_form = InvoiceDetailFormSet(request.POST, instance=Invoice,
                                               request=request)
    return self.render_to_response(
        self.get_context_data(
            form=form,
            invoice_detail_form=invoice_detail_form
        )
    )

表单.py

class BaseFormSetInvoice(BaseInlineFormSet):
    def __init__(self, *args, **kwargs):
        # call first to retrieve kwargs values, when the class is instantiated
        self.request = kwargs.pop("request")
        super(BaseFormSetInvoice, self).__init__(*args, **kwargs)
        self.queryset.concept = ConceptDetail.objects.filter(
            Q(area__name=self.request.POST.get('area')) | Q(area__name='default')
        )

class InvoiceForm(forms.ModelForm):
    class Meta:
        model = Invoice
        fields = ('invoice',)

class InvoiceDetailForm(forms.ModelForm):
    class Meta:
        model = InvoiceDetail
        fields = ('concept',)

InvoiceDetailFormSet = inlineformset_factory(Invoice, InvoiceDetail,
                                             formset=BaseFormSetInvoice,
                                             form=InvoiceDetailForm,
                                             extra=1)

我该如何修复它?,我需要阅读什么来解决这个问题,我尝试调试该过程,但没有找到答案。 我尝试这样做:

def FooForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(FooForm, self).__init__(*args, **kwargs)
        self.fields['concept'].queryset = ConceptDetail.objects.filter(area__name='default')

在 inlineformset_factory 中如何做到这一点?

最佳答案

经过大量测试,我的解决方案是使用 get_context_data 覆盖渲染之前的表单集。

def get_context_data(self, **kwargs):
        context = super(CreateInvoiceProcedureView, self).get_context_data(**kwargs)
        for form in context['invoice_detail_form']:
            form.fields['concept'].queryset = ConceptDetail.objects.filter(area__name=self.request.POST.get('area'))
        return context

关于Django 如何覆盖 inlineformset_factory 中的子表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30736970/

相关文章:

python - 属性错误 : module 'django.contrib.postgres.fields' has no attribute 'JSONField'

python - 如何使用 DRF 的 ModelSerializer 创建一个 django 用户

python - django allauth 中不显示登录页面

python - Django haystack+呼呼错误

Django - 更改内联表单集文本输入大小属性

python - Django 服务器不对 CSS 进行更改

python - 将查询集传递给django inlineform中的foreignkeyfield

python - 将 kwarg 传递给 inlineformset_factory?

django - 使用内联表单集创建模型和相关模型

Django Admin 喜欢我 ModelForm 中的内联