如何将有关 request.user 的信息提供给 clean 方法

Posted

技术标签:

【中文标题】如何将有关 request.user 的信息提供给 clean 方法【英文标题】:How to give the information about request.user to clean method 【发布时间】:2017-05-27 13:18:31 【问题描述】:

我有一个表格:

class CreateConferenceForm(forms.ModelForm):
    class Meta:
        model = Conference
        fields = ['name', 'participants']

    def clean(self):
        cleaned_data = super(CreateConferenceForm, self).clean()
        if not request.user.id in cleaned_data.get('participants'):
            raise forms.ValidationError('Error')

但我不知道如何从视图中导入请求对象,因为方法 is_valid 没有附加参数。我该怎么做?

【问题讨论】:

【参考方案1】:

给你的表单一个__init__ 方法,允许你传递一个用户:

def __init__(self, user, *args, **kwargs):
    self.user = user
    super().__init__(*args, **kwargs)

现在您可以在 clean 中使用self.user。无论您在哪里创建表单,请记住传递用户,例如form = CreateConferenceForm(request.user, request.POST) 在视图中。

【讨论】:

self.user = kwargs.pop('user', None) 不会破坏现有代码。当然,这需要检查 self.user 是否干净。 @schwobaseggl:我觉得如果不更新现有代码应该会中断。

以上是关于如何将有关 request.user 的信息提供给 clean 方法的主要内容,如果未能解决你的问题,请参考以下文章

将 request.user 传递给 Django 中的模板

如何使用 AbstractUser 类访问 request.user

如何将当前用户的属性转换为dict格式[重复]

Django:request.user.user_permissions 总是无

Django形成request.user

有人可以给我有关如何计算评论行的信息吗?