根据记录的用户

时间:2018-06-05 00:37:47

标签: django python-3.x django-forms

我有一个包含几个字段的表单,这些字段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 definedNameError: name 'user' is not defined

是否有解决方案或其他方法来过滤已登录用户所属的项目。 提前谢谢。

1 个答案:

答案 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中删除。