访问Django表单类中的用户数据
我有一个表单,我想使用用户数据来过滤choicefield的内容。 接下来,我在表单类的访问Django表单类中的用户数据,django,django-forms,request,Django,Django Forms,Request,我有一个表单,我想使用用户数据来过滤choicefield的内容。 接下来,我在表单类的\uuu init\uuu函数中添加了对user的所有引用: class MyChoiceField(forms.Form): def __init__(self, *args, **kwargs): self.user = kwargs.pop('user') super(MyChoiceField, self).__init__(*args, **kwargs)
\uuu init\uuu
函数中添加了对user
的所有引用:
class MyChoiceField(forms.Form):
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user')
super(MyChoiceField, self).__init__(*args, **kwargs)
user_id = self.user.id
myobjects = forms.ModelChoiceField(label='',queryset = Myobject.objects.values_list('name', flat=True).exclude(name__isnull=True).filter(Q(person__isnull=True) | Q(person=user_id)).distinct(),empty_label=None)
在我看来,我称之为:
def my_view(request):
my_list = MyChoiceField(user = request.user)
context = {
'my_list': my_list,
}
return render(request, 'foo/bar.html', context)
调试\uuuu init\uuuu
部分表明queryset内容正确,但在视图中,“我的列表”包含以下内容:
。
我是否应该在form类中包含\uuuu init\uuuu>部分之外的内容以使其正常工作?试试这个
class MyChoiceField(forms.Form):
def __init__(self, *args, **kwargs):
user = kwargs.pop('user')
super(MyChoiceField, self).__init__(*args, **kwargs)
user_id = user.id
这里有几个问题。您没有向表单传递请求。POST
,因此表单没有任何数据MyForm
比不是字段的MyChoiceField
更好。使用modelcooicefield
时,queryset
应返回常规queryset,不应使用values\u list
。也许您需要一个常规的表单。选择字段,或者使用label\u from\u instance
自定义显示方式。@Alasdair非常感谢,我尝试传递请求。POST
现在我的列表的绑定参数变成了True
(即
)。但是,表单仍然没有显示在页面上。以前,我有一个不依赖于用户的查询(因此在\uuuuu init\uuuu
部分之外),表单运行良好。有没有进一步的提示/想法来解释它为什么不起作用?您似乎还没有解决该字段的queryset
的问题。然而,我发现了另一个问题。您需要更新self.fields['myfield']
,就像您链接到的问题一样。设置myfield=forms.ModelChoiceField(…)
将不起作用。@感谢阿拉斯达尔发现这一点!如前一个问题中所述更新字段解决了我的问题,过滤后的表单现在正确显示。关于您的queryset
评论,实际上我发现modelcooicefield
即使在value\u list
中也适用于我,而在尝试forms.ChoiceField
时却不适用。我记下了你关于为以后定制显示的其他建议,但现在我的主要问题已经解决了。哈,谢谢你,如果我仍然像我原来的帖子一样使用表单。ModelChoiceField
,那么这确实也行得通。您是否介意解释一下为什么您的解决方案比原始解决方案更可取(即self.user=kwargs.pop('user')
)?