Аутентификация пользователей, которые наследуют от пользовательского класса django или django.contrib.auth.models.User

Я субкласс от Джанго 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 %}

Итак, как мне аутентифицировать мой User класс, который является подклассом из пользовательского класса django?

1 ответ

Убедитесь, что ваша модель находится в приложении, которое находится в списке установленных приложений, для Auth_USER_MODEL задано значение @alecxe и что вы запустили sync db.

Если вы запустили sync db ПЕРЕД настройкой новой пользовательской модели, вам нужно будет обнулить базу данных и запустить ее снова, когда ваша модель установлена. Это может объяснить, почему все работает, но это не так. Из документации:

Изменение AUTH_USER_MODEL сильно влияет на структуру вашей базы данных. Он изменяет доступные таблицы и влияет на построение внешних ключей и отношений "многие ко многим". Если вы намереваетесь установить AUTH_USER_MODEL, вы должны установить его перед созданием любых миграций или запуском manage.py migrate в первый раз.

Изменение этого параметра после создания таблиц не поддерживается make-миграциями и приведет к тому, что вам придется вручную написать набор миграций для исправления вашей схемы.

Другие вопросы по тегам