【问题标题】:Setting User's object's password and saving it设置用户对象的密码并保存
【发布时间】:2023-03-19 09:23:01
【问题描述】:

我目前正在做一个小项目,只是为了练习和学习 Django。我决定首先从创建广义上的用户身份验证开始。我陷入了注册问题。我不知道我应该向 set_password 方法提供什么作为第一个位置参数,并保存方法。需要自我论证,当我尝试在那里输入 'request' 时,出现以下错误:

TypeError at /register/ super(type, obj): obj 必须是 type 的实例或子类型

这是我使用的注册视图:

def register(request):
    if request.method == 'GET':
        form = UserCreateForm()
        return render(request, 'registration/register.html', {'form': form})
    if request.method == 'POST':
        form = UserCreateForm(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            username = cd['username']
            email = cd['email']
            password1 = cd['password1']
            password2 = cd['password2']
            user = User
            user.username = username
            user.email = email
            if password1 == password2:
                user.set_password(request, password1)
                user.save(request)
                # redirect to success page
            else:
                # return error
        else:
            # return error

这是我的表单代码:

class UserCreateForm(forms.Form):
    email = forms.EmailField(required=True)
    username = forms.CharField(required=True)
    password1 = forms.CharField(max_length=32, widget=forms.PasswordInput)
    password2 = forms.CharField(max_length=32, widget=forms.PasswordInput)

    class Meta:
        model = User
        fields = ('username', 'email', 'password1', 'password2')

如果您能帮我解决这个问题,我将不胜感激,或者可以参考其他方式注册用户。

【问题讨论】:

    标签: python django


    【解决方案1】:

    您没有调用 User 类来实例化它。

    user = User()
    

    【讨论】:

    • 谢谢,我不知道我怎么能忽略这一点。
    【解决方案2】:

    您可以简单地使用create_user 方法:

       ...
       if form.is_valid():
            cd = form.cleaned_data
            if cd['password1'] == cd['password2']:
                User.objects.create_user(
                    cd['username'],
                    cd['email'],
                    cd['password1'],
                )
                # Redirect to success page
       ...
    

    【讨论】:

    • 非常感谢,你说得对,这是更好的方法。
    【解决方案3】:

    我认为您需要阅读更多有关 python 类的信息。 您不为 self 传递参数 - 它只是 python 类方法的符号,self 代表实例,当调用实例方法时,您传递所有其他参数跳过 self。 我不确定它是否可以解决所有问题,但我在您的代码中看到的错误是: - 实例化类的正确方法:user = User() (你这样做的方式只是获得对类的引用);您还可以在实例化时将用户名和电子邮件作为参数传递, - 调用用户方法的正确方法是:user.set_password(password) 和 user.save()

    【讨论】:

    • 我同意你的观点,我对 Python 的类没有足够的了解。感谢您的提示。
    猜你喜欢
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 2011-10-19
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多