【问题标题】:Accessing request.user outside views.py在views.py之外访问request.user
【发布时间】:2012-08-19 01:24:38
【问题描述】:

我有一个文件 forms.py,我在其中定义了所有表单。我需要对我的一个表单域进行密码验证。

在我的 forms.py 中

class ChangePasswordForm(forms.Form):
    old_password = forms.CharField(widget=forms.PasswordInput)
    new_password= forms.CharField(widget=forms.PasswordInput)
    new_password_again= forms.CharField(widget=forms.PasswordInput)

    def clean_old_password(self):
        data = self.cleaned_data['old_password']
        if data != currently_logged_in_user.password:
            raise forms.ValidationError("Password Incorrect")

        return data

我需要访问当前登录的用户,以便我可以使用currently_logged_in_user.password 进行验证,但我目前正在使用forms.py 而不是views.py,所以我不知道该怎么做?请帮忙

【问题讨论】:

    标签: django forms validation


    【解决方案1】:

    您需要将用户从视图传递到您的表单。你可以这样做:

    views.py

    my_form = ChangePasswordForm(user=request.user, data=request.POST)
    ...
    

    forms.py

    class ChangePasswordForm(forms.Form):
        ...
    
        def __init__(self, *args, **kwargs):
            self.user = kwargs.pop('user', None)
            super(ChangePasswordForm, self).__init__(*args, **kwargs)
    
        def clean_old_password(self):
            old_password = self.cleaned_data['old_password']
            if not self.user.check_password(old_password)
                raise forms.ValidationError("Password Incorrect")
            return old_password
    

    【讨论】:

    • data != self.user.password 始终评估为 True 值,因此我使用 auth=authenticate(username=self.user.username,password=data) 代替。它的工作原理谢谢
    • 是的,self.user.password 将是包含盐的哈希值。 From the docs, "如果您想通过将纯文本密码与数据库中的哈希密码进行比较来手动验证用户身份,请使用便捷功能 django.contrib.auth.hashers.check_password()"。
    猜你喜欢
    • 2013-07-20
    • 2013-11-17
    • 2012-01-20
    • 1970-01-01
    • 2011-04-09
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    相关资源
    最近更新 更多