django表单从查询集中排除动态对象
我试着通过重写初始化方法来从表单的数据集中排除一个对象。不过我一直收到一个错误: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 个回答
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()
这个方法会从 kwargs
中移除 exclude
参数,如果它存在的话。如果不存在,它就会返回一个空的字典 {}
。
然后你可以用下面的方式来创建你的表单:
def travel(request):
travel_form = TravelForm(exclude={'name': request.user.character.region.name})