Hans de Jong
Hans de Jong

Reputation: 2078

django form exclude dynamic object from queryset

I try to exclude a object from the form queryset by rewriting the init. However i keep getting: TypeError: init() got an unexpected keyword argument 'name' now i am pretty new to init function so im not sure where i go wrong.

My form:

class TravelForm(forms.Form):
    """ travel form, own location excluded """

    travel = forms.ModelChoiceField(empty_label=None, queryset=Region.objects.all(), widget=forms.RadioSelect())

    def __init__(self, *args, **kwargs):
        super(TravelForm, self).__init__(*args, **kwargs)
        self.fields['travel'].queryset = Region.objects.exclude(**kwargs)

and in my view i use: where request.user.character.region.name is the name of the excluded region (i dont know how to exclude something by object, hence the name)

def travel(request):
    travel_form = TravelForm(name=request.user.character.region.name)

What am i doing wrong?

Upvotes: 0

Views: 571

Answers (1)

augustomen
augustomen

Reputation: 9739

You should not replace all named args in a Form.__init__. It is just simpler to declare a single new parameter:

class TravelForm(forms.Form):
    """ travel form, own location excluded """

    travel = forms.ModelChoiceField(empty_label=None, queryset=Region.objects.all(), widget=forms.RadioSelect())

    def __init__(self, *args, **kwargs):
        exclude_args = kwargs.pop('exclude', {})
        super(TravelForm, self).__init__(*args, **kwargs)
        self.fields['travel'].queryset = Region.objects.exclude(**exclude_args)

kwargs.pop() will remove exclude parameters from kwargs, if it is there. Otherwise, it will just return an empty dict {}.

Then you can instantiate your form with:

def travel(request):
    travel_form = TravelForm(exclude={'name': request.user.character.region.name})

Upvotes: 2

Related Questions