我尝试通过重写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)
我做错了什么?
答案 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})