2015-09-14 56 views
0

Django get_initial未在表单中填充产品字段。我期待一个下拉菜单,查询结果在get_initial覆盖函数中定义。Django 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> 

回答

1

一种简单的方法来设定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 
+0

这不是多余的吗? – tilaprimera

+0

如果kwargs [“initial”]中的“product”抛出KeyError – tilaprimera

+1

@tilaprimera我刚看过'CreateView'并且没有'get_initial'方法。这可能只属于'UpdateView'。我会更新我的答案。 –