Python 更改django表单中输入的内容,请求数据位于uuu init_uuuu()中
我有一个django表单,它包含一个TypedMultipleChoiceField,其中包含一组用户。我从auth用户模型中获得了用户,但我想从选项中删除当前登录的用户。我一直在尝试将请求数据引入表单的init方法,然后从选项列表中删除登录用户,但出于某种原因,表单仍然在选项列表中呈现登录用户。代码如下: Views.pyPython 更改django表单中输入的内容,请求数据位于uuu init_uuuu()中,python,django,Python,Django,我有一个django表单,它包含一个TypedMultipleChoiceField,其中包含一组用户。我从auth用户模型中获得了用户,但我想从选项中删除当前登录的用户。我一直在尝试将请求数据引入表单的init方法,然后从选项列表中删除登录用户,但出于某种原因,表单仍然在选项列表中呈现登录用户。代码如下: Views.py class IndexView(LoginRequiredMixin, generic.ListView, generic.edit.FormMixin): def
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感谢您的建议,我已经在代码中做了更改。我也应该编辑问题和答案吗?