django表单从queryset中排除动态对象

时间:2014-05-13 18:59:36

标签: python django forms init

我尝试通过重写init来从表单queryset中排除对象。 但是我一直得到:TypeError: init ()得到了一个意外的关键字参数' name' 现在我对 init 功能很新,所以我不知道哪里出错了。

我的表格:

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)

在我看来我使用: 其中request.user.character.region.name是被排除区域的名称(我不知道如何按对象排除某些东西,因此名称)

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

我做错了什么?

1 个答案:

答案 0 :(得分:2)

您不应该替换Form.__init__中的所有命名参数。声明一个新参数更简单:

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()会从exclude移除kwargs个参数,如果有的话。否则,它将返回一个空的字典{}

然后您可以使用以下内容实例化表单:

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