Python 更改django表单中输入的内容,请求数据位于uuu init_uuuu()中

Python 更改django表单中输入的内容,请求数据位于uuu init_uuuu()中,python,django,Python,Django,我有一个django表单,它包含一个TypedMultipleChoiceField,其中包含一组用户。我从auth用户模型中获得了用户,但我想从选项中删除当前登录的用户。我一直在尝试将请求数据引入表单的init方法,然后从选项列表中删除登录用户,但出于某种原因,表单仍然在选项列表中呈现登录用户。代码如下: Views.py class IndexView(LoginRequiredMixin, generic.ListView, generic.edit.FormMixin): def

我有一个django表单,它包含一个TypedMultipleChoiceField,其中包含一组用户。我从auth用户模型中获得了用户,但我想从选项中删除当前登录的用户。我一直在尝试将请求数据引入表单的init方法,然后从选项列表中删除登录用户,但出于某种原因,表单仍然在选项列表中呈现登录用户。代码如下:

Views.py

class IndexView(LoginRequiredMixin, generic.ListView, generic.edit.FormMixin):
    def get_form_kwargs(self):
        kwargs = super(IndexView, self).get_form_kwargs()
        kwargs.update({'user': self.request.user})
        return kwargs

    def get_queryset(self):
        return Project.objects.filter(owner=self.request.user.id).order_by('begin_date')

    form_class = CreateProject
    context_object_name = 'project_list'
    template_name = 'projects/project_index.html'
forms.py

class CreateProject(forms.Form):
    contributor_id = forms.TypedMultipleChoiceField(choices=list(User.objects.values_list('id','username')),
                                                    required=False, empty_value=[])
    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop("user")
        super(CreateProject, self).__init__(*args, **kwargs)
        choices = self.fields['contributor_id'].choices
        del choices[choices.index((self.user.id, self.user.username))]
class CreateProject(forms.Form):
    contributor_id = forms.ModelMultipleChoiceField(queryset=None, required=False)

    def __init__(self, *args, **kwargs):
        self.user_id = kwargs.pop("user_id")
        super(CreateProject, self).__init__(*args, **kwargs)
        self.fields['contributor_id'].queryset = User.objects.exclude(id=self.user_id)
当我在init方法中放入pdb.set_trace()并在执行delete之后检查表单字段的状态时,一切看起来都是正确的。我做错了什么


作为参考,我在视图中使用get_form_kwargs,在表单中使用init。

解决方案是将TypedMultipleChoiceField更改为ModelMultipleChoiceField,然后在init方法中将queryset设置为用户组(除了登录的用户):

views.py

class IndexView(LoginRequiredMixin, generic.ListView, generic.edit.FormMixin):
    def get_form_kwargs(self):
        kwargs = super(IndexView, self).get_form_kwargs()
        kwargs.update({'user_id': self.request.user.id})
        return kwargs

    def get_queryset(self):
        return Project.objects.filter(owner=self.request.user.id).order_by('begin_date')

    template_name = 'projects/project_index.html'
    context_object_name = 'project_list'
    form_class = CreateProject
forms.py

class CreateProject(forms.Form):
    contributor_id = forms.TypedMultipleChoiceField(choices=list(User.objects.values_list('id','username')),
                                                    required=False, empty_value=[])
    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop("user")
        super(CreateProject, self).__init__(*args, **kwargs)
        choices = self.fields['contributor_id'].choices
        del choices[choices.index((self.user.id, self.user.username))]
class CreateProject(forms.Form):
    contributor_id = forms.ModelMultipleChoiceField(queryset=None, required=False)

    def __init__(self, *args, **kwargs):
        self.user_id = kwargs.pop("user_id")
        super(CreateProject, self).__init__(*args, **kwargs)
        self.fields['contributor_id'].queryset = User.objects.exclude(id=self.user_id)

这不是对您问题的直接回答,但为什么不使用
modelmultiplechoicefield
来更改查询集以删除登录用户?@dirkgroten很好,我是django的新手,所以我不知道它的存在。。我更改了代码,现在一切正常!谢谢我可以建议一些改进吗?首先,如果请求中唯一需要的是当前用户id,那么不要将整个请求传递给表单,只传递当前用户id-这将使表单更容易进行单元测试。另外-这确实是一件小事,但是-,
ModelManager
(您模型的
对象
属性)直接公开了底层Queryset的
排除
方法(实际上还有很多其他方法),因此
YourModel.objects.all().exclude(…)
是多余的-
YourModel.objects.exclude(…)
工作正常,避免了无用的实例、副本和方法调用。@Brunodesshuilliers感谢您的建议,我已经在代码中做了更改。我也应该编辑问题和答案吗?