Django get_initial 不工作

Django get_initial not working

Django get_initial 未在表单中填充产品字段。我期待一个下拉菜单,查询集结果在 get_initial 重写函数中定义。

class PurchaseRequestDetailForm(forms.ModelForm):
    class Meta:
        model = PurchaseRequestDetail
        fields = ["product", "variations", "quantity", "fulfilled", "vat", "discount", "surcharges", "active"]
        exclude = ("purchase_request", )


class PurchaseRequestDetailCreateView(CreateView):
    model = PurchaseRequestDetail
    form_class = PurchaseRequestDetailForm
    template_name = "inventory/purchaserequestdetail_form.html"

    def get_pr_obj(self):
        pr_id = self.request.session["pr_id"]
        return PurchaseRequest.objects.get(id=pr_id)

    def get_initial(self):
        initial = super(PurchaseRequestDetailCreateView, self).get_initial()
        try:
            pr_obj = self.get_pr_obj()
            initial["product"] = pr_obj.vendor.vendors_products.all()
        except KeyError:
            pass
        self.form_class(initial)
        return initial

模板:

<td>{{ form.product|css_class:"form-control" }}</td>

设置 ModelChoiceField 查询集的一种简单方法是以 init();

形式设置字段属性
class PurchaseRequestDetailForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):    
        # Get initial data passed from the view
        self.product = None
        if 'product' in kwargs['initial']:
            self.product = kwargs['initial'].pop('product')

        super(PurchaseRequestDetailForm, self).__init__(*args, **kwargs)
        self.fields['product'].queryset = self.product

    class Meta:
        model = PurchaseRequestDetail
        fields = ["product", "variations", "quantity", "fulfilled", "vat", "discount", "surcharges", "active"]
        exclude = ("purchase_request", )

您应该从 ModelFormMixin 连接到 get_form_kwargs 以将您的数据传递到表单。

class PurchaseRequestDetailCreateView(CreateView):
    model = PurchaseRequestDetail
    form_class = PurchaseRequestDetailForm
    template_name = "inventory/purchaserequestdetail_form.html"

    def get_pr_obj(self):
        pr_id = self.request.session["pr_id"]
        return PurchaseRequest.objects.get(id=pr_id)

    def get_form_kwargs(self):
        """
        Returns the keyword arguments for instantiating the form.
        """
        kwargs = super(PurchaseRequestDetailCreateView, self).get_form_kwargs()
        kwargs.update(
            {'initial': 
                {'product': pr_obj.vendor.vendors_products.all()}
            }
        )
        return kwargs