我有一个包含几个字段的表单,这些字段project
应该是一个select
窗口小部件,其中包含已记录用户所在的项目。这是我的代码的一部分。
class PublicationForm(forms.ModelForm):
def __init__(self, *args, user=None, **kwargs):
super(PublicationForm, self).__init__(*args, **kwargs)
self.user = user
project = forms.ModelChoiceField(
queryset=ProjectMembers.objects.filter(user__username=user),
widget=forms.Select,
required=False
)
class Meta:
model = Publication
fields = ['title', 'content', 'project', 'source']
我将记录的用户传递到我视图中的表单,如下所示
PublicationForm(request.POST, user=request.user)
但是我无法访问用户变量的表单类,我试过了
...queryset=ProjectMembers.objects.filter(user__username=self.user)..
...queryset=ProjectMembers.objects.filter(user__username=user)..
但是我遇到了这些错误
NameError: name 'self' is not defined
和
NameError: name 'user' is not defined
是否有解决方案或其他方法来过滤已登录用户所属的项目。 提前谢谢。
答案 0 :(得分:0)
您的project
定义仅在服务器运行时完成一次,因此它不能依赖于self
或任何其他内容。您必须区分类定义和实例创建。要使其动态化,您必须将其从类定义中删除并在__init__
内设置,以便您可以在那里访问self
。
def __init__(self, *args, user=None, **kwargs):
super(PublicationForm, self).__init__(*args, **kwargs)
self.user = user
self.fields['project'] = forms.ModelChoiceField(
queryset=ProjectMembers.objects.filter(
user__username=self.user
),
widget=forms.Select,
required=False
)
通过这种方式,表单的每个实例都会得到不同的project
字段。
另外,如果您收到fields
之类的错误或类似错误,则可能必须将其从Meta
field is not defined
中删除。