Skip to content Skip to sidebar Skip to footer

Django "__init__takes At Least 2 Arguments" For Dynamic Drop Down List Function

Regarding the django dynamic drop down list, I made some trials, If no dynamic function, it works without problem from django import forms from django.forms import ModelForm from .

Solution 1:

You must pass queryset to your ModelChoiceField. From docs:

For more complex uses, you can specify queryset=None when declaring the form field and then populate the queryset in the form’s __init__() method:

classinputform(forms.ModelForm):
    region = forms.ModelChoiceField(queryset=None, label=u'Region')


    def__init__(self,*args,**kwargs):
        super(inputform,self).__init__(*args,**kwargs)
        self.fields['region'].choices=((x['Region'].que,x['Region'].disr) for x in dupont.objects.values('Region').distinct())

Solution 2:

You can do that in two of the following ways(assuming region is FK with input model):

First:

classinputform(forms.ModelForm):

    regionlist = forms.ModelChoiceField(queryset=None)

    defregion_list(self):
       # This method returns a list consists of primary keys of Region.return [x['Region'] for x in result.objects.values('Region').distinct()]

    def__init__(self,*args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['regionlist'].queryset = Region.objects.filter(id__in=self.region_list())

In region model, add this method to display que and disr to display them in choice field.

classRegion(models.Model):
    ...
    def__str__(self):
       return'{0}, {1}'.format(self.que, self.disr)

Second:

classinputform(forms.ModelForm):
        regionlist = forms.ChoiceField()
        defregion_list(self):
           # This method returns a list consists of primary keys of Region.return [x['Region'] for x in result.objects.values('Region').distinct()]

        def__init__(self,*args, **kwargs):
             super().__init__(*args, **kwargs)

             self.fields['regionlist'].choices = [(Region.objects.get(id=x).que, User.objects.get(id=x).disr) for x inself.region_list()]

        defclean_regionlist(self):
            # returns region objectreturn Region.objects.get(pk=self.cleaned_data['regionlist'])

Post a Comment for "Django "__init__takes At Least 2 Arguments" For Dynamic Drop Down List Function"