2017-07-27 36 views
1

我在forms.py中創建下拉列表並篩選數據我收到一個名爲layer_id的變量。並像這樣進入layer_id = kwargs['layer_id']。所有的事情都很好,但是當我分配結束時提交這樣的self.fields['apn'].queryset= Field.objects.filter(layer=layer)。調用去數據庫的fields表,而不是分配我在forms.py中聲明的這些字段。那麼,誰我可以分配給字段forms.py如何從視圖導入數據後將下拉數據分配到字段

class labelModelForm(forms.ModelForm): 
    model = Labels_tool_ 
    fields = ['apn', 'owner_name', 'situs_addr_One', 'situs_addr_Two', 'mailing_addr_One', 'mailing_addr_Two'] 
    apn = forms.ModelChoiceField(queryset=Field.objects.values_list('name', flat=True), empty_label="(Choose field)") 

    def __init__(self, *args, **kwargs): 
    //getting layer_id from views 
     layer_id = kwargs['layer_id'] 
     print   layer_id 
     layer=Layer.objects.filter(id=layer_id).first() 
     x=Field.objects.filter(layer=layer) 
     //On this step when modify queryset I get error 
     self.fields['apn'].queryset= Field.objects.filter(layer=layer) 

回答

1
def __init__(self, *args, **kwargs): 
    layer_id = kwargs.pop('layer_id', None) 
    super(labelModelForm, self).__init__(*args, **kwargs) 
    layer=Layer.objects.filter(id=layer_id).first() 
    x=Field.objects.filter(layer=layer) 
    self.fields['apn'].queryset= Field.objects.filter(layer=layer) 

我希望這將幫助你

改變你的形式

class labelModelForm(forms.ModelForm): 
     apn = forms.ModelChoiceField(Field.objects.values_list('name', flat=True), empty_label="(Choose field)") 
    class Meta: 
     model = Labels_tool_ 
     fields = ['apn', 'owner_name', 'situs_addr_One', 'situs_addr_Two', 'mailing_addr_One', 'mailing_addr_Two'] 
+0

你改變了什麼? – Learner

+0

使用它然後你會明白 – Exprator

+0

給出錯誤「__init __()有一個意想不到的關鍵字參數'layer_id'」,仍然不能訪問表單中的字段 – Learner

0

,如果你想一些變量,以形成例如,您可以使用get_form_kwargs方法。 你可以在__init__中使用它。

#views.py 

class ExampleRegisterView(CreateView): 
    model = ExampleModel 
    form_class = RegisterExampleForm 
    template_name = 'example.html' 

    def get_form_kwargs(self): 
     kwargs = super().get_form_kwargs() 
     kwargs['layer_id'] = 12 # for example, I give 12. 
     return kwargs 

#forms.py 

class RegisterExampleForm(forms.ModelForm): 
    apn = forms.ChoiceField(label="test") 
    class Meta: 
     model = ExampleModel 
     fields = ['yourfield', ] 
    def __init__(self, *args, **kwargs): 
     layer_id = kwargs.pop('layer_id', None) 
     super().__init__(*args, **kwargs) 
     if layer_id: 
      layer = Layer.objects.get(id=layer_id).first() 
     self.fields['apn'].choices = Field.objects.filter(layer=layer) 
相關問題