【问题标题】:'UserCreationForm' object has no attribute 'get_username' django 1.8'UserCreationForm' 对象没有属性'get_username' django 1.8
【发布时间】:2015-04-12 20:34:29
【问题描述】:

所以我是 django 的新手,对 python 的了解足以不称自己为初学者,但我绝不是专业人士。我只是想让用户身份验证在一个小型 django 应用程序上工作。我正在使用默认身份验证系统https://docs.djangoproject.com/en/1.8/topics/auth/default/,内置表单、登录、注销等都有自己的视图,但 UserCreationForm 没有自己的视图,所以我想我必须自己制作。不知道我做错了什么。

这是我的观点.py

  1 from django.shortcuts import render
  2 from django.http import HttpResponse
  3 from django.contrib.auth.forms import UserCreationForm
  4 from django.contrib.auth import login
  5
  6 def home(request):
  7         return HttpResponse("This is a barebones homepage")
  8
  9 def register(request):
 10         registered = False
 11
 12         if request.method == 'POST':
 13                 user_form = UserCreationForm(data=request.POST)
 14
 15                 if user_form.is_valid():
 16                         user = user_form.save()
 17                         username = user_form.get_username()
 18                         password = user_form.clean_password2()
 19                         login(request,user)
 20                 else:
 21                         print user_form.errors
 22         else:
 23                 user_form = UserCreationForm()
 24
 25         return render(request, 'registration/register.html', {'user_form': user_form, 'registered': registered}    )
~

这是我的 register.html

<!DOCTYPE html>

<html>
        <head>
                <title>Jet!</title>
        </head>

        <body>
                {% if registered %}
                        Jet! says Thank you for registering!
                        <a href='/'>Return to the homepage.</a><br />
                {% else %}
                <form method="post" action="/register/">
                {% csrf_token %}
                {{ user_form.as_p }}
                <input type="submit" name="submit" value="Register" />
                </form>
                {% endif %}
        </body>
</html>

【问题讨论】:

    标签: python django authentication django-1.8


    【解决方案1】:

    首先,username = user_form.get_username() 行给出了错误,因为正如消息所述,表单没有get_username 方法。您可以使用 user_form.cleaned_data['username']

    访问用户名

    其次,password = user_form.clean 行会出错,因为表单没有属性clean。如果需要,可以使用user_form.cleaned_data['password1']password1 字段中获取值。

    在你login用户之前,你必须对他们进行身份验证,否则你会得到一个关于用户没有属性backend的错误。

    综合起来,你有:

    if user_form.is_valid():
        user_form.save()
        username = user_form.cleaned_data['username']
        password = user_form.cleaned_data['password1']
        user = authenticate(username=username, password=password)
        login(request, user)
    

    您必须通过将导入更改为来导入 authenticate 方法:

    from django.contrib.auth import authenticate, login
    

    请注意,您尚未在代码中的任何位置设置registered=True。通常,在成功提交表单后进行重定向是一种很好的做法,以防止重复提交。

    【讨论】:

    • 所以我按照你说的修改了views.py,但是现在报错“'User' object has no attribute 'backend'”是什么意思?
    • 好的,我想您需要在login 之前致电authenticate。我已经更新了我的答案。
    • 成功了!非常感谢。所以回顾一下,我犯的错误是对于表单我应该使用 form.cleaned_data['attribute'] 来获取表单中的响应?
    • 是的,在视图中,您使用form.cleaned_data['field_name'] 访问已清理的数据。您的代码中缺少的另一部分是调用authenticate()
    【解决方案2】:

    将 user_form.get_username() 更改为 request.user.username

    username = user_form.get_username() = request.user.username
    

    【讨论】:

    • 用户还没有登录,所以request.user是匿名用户,没有用户名。
    猜你喜欢
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 1970-01-01
    • 2016-03-06
    • 2020-02-11
    • 2015-02-19
    • 2016-03-30
    相关资源
    最近更新 更多