【问题标题】:Authentication is not working for custom authentication身份验证不适用于自定义身份验证
【发布时间】:2016-08-04 11:57:32
【问题描述】:

我想在 Django 中制作自定义登录页面。我可以成功注册用户,但是当我想登录时它没有登录。

我的views.py 用于登录:

def login_user(request):
    context = RequestContext(request)
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        print username
        print password

        user = authenticate(username=username, password=password)
        if user:
            print "rrrrr"
            if user.is_active:
                login(request, user)
                return HttpResponseRedirect('/success/')
            else:
                return HttpResponse("Your Rango account is disabled.")
        else:
            print "Invalid login details: {0}, {1}".format(username, password)
            return HttpResponse("Invalid login details supplied.")
    else:
         return render_to_response('login.html', {}, context)

为了注册,我写了这段代码:

def register(request):
    context = RequestContext(request)
    registered = False
    print "inside register view"
    if request.method == 'POST':

        profile_form = ProfileForm(data=request.POST)
        if profile_form.is_valid():

            profile = profile_form.save(commit=False)

            profile.save()
            registered = True
        else:
            print profile_form.errors
    else:
        profile_form = ProfileForm()

    return render_to_response(
            'register.html',
            {'profile_form': profile_form, 'registered': registered},
            context)

我的models.py

class Profile(models.Model):
    # user=models.OneToOneField(User)
    username=models.CharField(max_length=50)
    first_name=models.CharField(max_length=50)
    last_name=models.CharField(max_length=50)
    email=models.EmailField()
    contact=models.CharField(max_length=50)
    password=models.CharField(max_length=50)

    def __str__(self):
        return self.username or u'

当我提供 usernamepassword 时,它会接受电子邮件并传递它,但总是进入 else 部分Invalid login details。它不会进入 if 条件。我怎样才能做到这一点?

【问题讨论】:

  • 听起来userNone,因为身份验证详细信息不正确。您看到什么错误(如果有)?你的print 声明显示了什么?
  • 请跟随我suggested 否则包括“你如何创建用户”的代码也许有人会回答你的问题。我怀疑您将密码保存为纯文本...
  • 我没有收到任何错误。它只是执行 else 部分
  • 不得像这样进行身份验证。您将密码存储为纯文本,这是非常不安全的。如果你想要一个自定义用户,文档中有一个full example

标签: python django authentication


【解决方案1】:

您似乎没有在django.contrib.auth.models.User 中存储任何数据,您应该是这样的:

models.py

class Profile(models.Model):
    user = models.OneToOneField(User)
    contact = models.CharField(maX_length = 50)
    # User class contain other fields that you need.

forms.py

class UserForm(forms.Form):
    class Meta:
        model = User

class ProfileForm(forms.Form):
    class Meta:
        model = Profile

注册码:

def register(request):
    # ...
    # Your codes here

    profile_form = ProfileForm(data=request.POST)

    # Add this line:
    user_form = UserForm(data=request.POST)

    if user_form.is_valid() and profile_form.is_valid():
        user = user_form.save()
        user.set_password(user.password)
        user.save()

        profile = profile_form.save(commit=False)
        profile.save()
        registered = True
    else:
        print profile_form.errors
        print user_forms.errors
else:
    profile_form = ProfileForm()
    user_form = UserForm()

return render_to_response(
        'register.html',
        {'profile_form': profile_form, 'user_form':user_form 'registered': registered},
        context)

您可以找到更多Django官方用户字段here

【讨论】:

  • 这是我想使用用户模型的时候。如果只想使用配置文件表单,那么我该如何执行相同的过程
  • 如果您正在寻找一种使用 Django authentication/login/logout 的方法,我会为您提供上面解释的结构。但是如果你想在你的应用中自定义认证可以看here
猜你喜欢
  • 2020-04-01
  • 2022-12-10
  • 2018-09-26
  • 2010-12-17
  • 2013-11-19
  • 2015-11-12
  • 2018-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多