django表单从查询集中排除动态对象

0 投票
1 回答
568 浏览
提问于 2025-04-18 06:27

我试着通过重写初始化方法来从表单的数据集中排除一个对象。不过我一直收到一个错误: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})

撰写回答