【问题标题】:Authenticating users that inherit from the django user class or django.contrib.auth.models.User验证继承自 django 用户类或 django.contrib.auth.models.User 的用户
【发布时间】:2013-09-07 17:24:03
【问题描述】:

我从 django User 类中继承来创建我自己的个性化版本。我可以谈论的User 类是django.contrib.auth.models.User

这就是它的样子:

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


class User(Auth_User):

    # User data
    Age = models.IntegerField(blank=False, default=0)
    middle_name = models.CharField(blank=True, max_length=255)

    # Properties
    @property
    def full_name(self):

        return str(self.first_name + ' ' + (self.middle_name + ' ' if self.middle_name else '') + self.last_name)

    # Overridden functions
    def __unicode__(self):

        return self.full_name

请不要说这是模型的简化版本,还有更多数据,与这个问题无关。

现在,当我尝试通过传统方式进行身份验证时,它失败了:

def login(request):

    if request.method == 'GET':
        return render(request, "User/login.html")

    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']

        new_user = authenticate(username=username, password=password)

        if new_user is not None:
            if new_user.is_active:
                login(request, new_user)
        else:
            print "User is not alive, he/she died! :("

        return HttpResponseRedirect('/users/')

HTML 没什么特别的:

{% extends 'layout.html' %}

{% block content %}
    <form action="/users/login" method="post">
        {% csrf_token %}
        <label for="username">
            Username:
            <input type="text" name="username" id="username"/>
        </label>
        <label for="password">
            Password:
            <input type="password" name="password" id="password"/>
        </label>
        <input type="submit" value="Submit"/>
    </form>
{% endblock %}

那么,如何验证从 django 用户类继承的 User 类?

【问题讨论】:

  • 你试过设置AUTH_USER_MODEL设置吗?
  • @alecxe:不,我还没有。不过我正在处理中。
  • 当你说它失败时,authenticate 会返回一个None 吗?
  • @karthikr Yesm 它返回一个无,即使用户实际上在那里。

标签: python django django-authentication


【解决方案1】:

确保您的模型位于已安装应用列表中的应用中,Auth_USER_MODEL 设置为提到的@alecxe,并且您运行了同步数据库。

如果您在设置新用户模型之前运行了同步数据库,那么您需要核对数据库并再次运行它,因为您的模型已经就位。这可以解释为什么一切似乎都在工作,但事实并非如此。来自docs

更改 AUTH_USER_MODEL 对您的数据库结构有很大影响。它改变了可用的表,它会影响外键和多对多关系的构建。如果您打算设置 AUTH_USER_MODEL,则应在创建任何迁移或第一次运行 manage.py migrate 之前设置它。

makemigrations 不支持在创建表后更改此设置,这将导致您必须手动编写一组迁移来修复您的架构。

【讨论】:

    猜你喜欢
    • 2021-01-14
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多