I want to create form fields in Django views.py ra

2020-05-07 04:25发布

I am creating my form in Form.py like this:

class pdftabelModelForm(forms.ModelForm):
    class Meta:
        model = pdftabel_tool_
        fields = ['apn', 'owner_name']
    apn = forms.ModelChoiceField(queryset= Field.objects.values_list('name', flat=True), empty_label="(Choose field)")
    owner_name = forms.ModelChoiceField(queryset= Field.objects.values_list('name', flat=True), empty_label="(Choose field)")

But due to some reasons like 'self' is not available in form.py. I can only access it in views.py. So I want to make it like

   class FieldForm(ModelForm):
    class Meta:
        model = pdftabel_tool_
        fields = (
            'apn',
            'owner_name',)

How can I make these fields as dropdown like I did in my forms.py?

1条回答
混吃等死
2楼-- · 2020-05-07 04:34

Why are you set on doing it in views.py? forms.py is the appropriate place to do this.

Instead of redefining your fields, you should use the form's __init__ method to override the querysets for your fields, like so:

class pdftabelModelForm(forms.ModelForm):
    class Meta:
        model = pdftabel_tool_
        fields = ['apn', 'owner_name']

    def __init__(self, *args, **kwargs):
        super(pdftabelModelForm, self).__init__(*args, **kwargs)
        self.fields['apn'].queryset = X
        self.fields['owner_name'].queryset = X

EDIT: if you need to pass extra parameters to your form, update the init method to this:

    def __init__(self, *args, **kwargs):
        self.layer_id = self.kwargs.pop('layer_id')
        super(pdftabelModelForm, self).__init__(*args, **kwargs)
        self.fields['apn'].queryset = X
        self.fields['owner_name'].queryset = X

And when you initialize your form from views.py, pass the parameter:

form = pdftableModelForm(layer_id=X)
查看更多
登录 后发表回答