【问题标题】:Authenticate the django user using phone email and username使用电话电子邮件和用户名验证 django 用户
【发布时间】:2021-05-15 11:08:25
【问题描述】:

我正在尝试实现一个登录功能,这样用户就可以使用他们的电子邮件或电话号码或用户名登录,但是 Django 在它的用户模型中只提供电子邮件字段,所以我用 One 创建了另一个模型-To-One-Relation to User 模型并提供了电话号码列,但现在我不知道如何实现我之前提到的此类功能。

我的models.py

from django.db import models
from django.contrib.auth.models import User

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    user_type = models.IntegerField(choices=USER_TYPE, default=3)
    mobile = models.BigIntegerField(unique=True)

我的views.py

(我知道这是一团糟,但我不知道如何拥有这样的功能)

def login(request):
    if request.method == "POST":
        username = request.POST['username']
        password = request.POST['password']

        user = auth.authenticate(username=username, password=password)
        if user is not None:
            auth.login(request, user)
            messages.success(request, 'You are logged in successfully!')
            return redirect('/dashboard')
        else:
            user = auth.authenticate(profile_phone=username, password=password)
            if user is not None:
                auth.login(request, user)
                messages.success(request, 'You are logged in successfully!')
                return redirect('/dashboard')
            else:
                user = auth.authenticate(email=username, password=password)
                if user is not None:
                    auth.login(request, user)
                    messages.success(request, 'You are logged in successfully!')
                    return redirect('/dashboard')
                else:
                    messages.error(request, 'Invalid username or password')
                    return redirect('/login')
    else:
        if request.user.is_authenticated:
            messages.success(request, 'You are already logged in')
            return redirect("/dashboard")
        return render(request, "accounts/login.html")

【问题讨论】:

    标签: python django django-models django-views


    【解决方案1】:

    Django 用户模型只提供电子邮件字段是不正确的。它还具有您想要的用户名字段。检查文档here。如果要添加电话号码或其他字段,可以这样实现:

    from django.contrib.auth.models import User
    
    class MyUser(User):
        user_type = models.IntegerField(choices=USER_TYPE, default=3)
        mobile = models.BigIntegerField(unique=True)
    

    并且该类将包含基本 User 模型所具有的所有内容。

    此外,Django 提供了一个您也可以使用的内置登录方法。检查this tutorial

    【讨论】:

    • 非常感谢好友的帮助!但我通过更改我的登录功能解决了这个问题。我首先使用电话号码从个人资料中获取用户 ID,然后使用该 ID 从用户那里获取用户名,仅此而已。
    • @SpyDie 很好,我很高兴你解决了。祝你有美好的一天
    猜你喜欢
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    相关资源
    最近更新 更多