Почему наследование модели пользователя не работает должным образом? - PullRequest
0 голосов
/ 16 февраля 2010

Я пытаюсь использовать наследование модели User в моем приложении django. Модель выглядит так:

from django.contrib.auth.models import User, UserManager

class MyUser(User):
    ICQ = models.CharField(max_length=9)
    objects = UserManager()

и аутентификация выглядит так:

import sys

from django.db import models
from django.db.models import get_model
from django.conf import settings
from django.contrib.auth.models import User, UserManager
from django.contrib.auth.backends import ModelBackend
from django.core.exceptions import ImproperlyConfigured

class AuthBackend(ModelBackend):
    def authenticate(self, email=None, username=None, password=None):
        try:            
            if email:
                user = self.user_class.objects.get(email = email)
            else:
                user = self.user_class.objects.get(username = username)

            if user.check_password(password):
                return user

        except self.user_class.DoesNotExist:
            return None

    def get_user(self, user_id):
        try:
            return self.user_class.objects.get(pk=user_id)
        except self.user_class.DoesNotExist:
            return None

    @property
    def user_class(self):
        if not hasattr(self, '_user_class'):
            self._user_class = get_model(*settings.CUSTOM_USER_MODEL.split('.', 2))
            if not self._user_class:
                raise ImproperlyConfigured('Could not get custom user model')
        return self._user_class

Но если я пытаюсь аутентифицироваться - возникает ошибка " Соответствующий запрос MyUser не существует " для self.user_class.objects.get (username = username) вызов. Похоже, что администратор, созданный при базовой синхронизации (я использую sqlite3), сохраняет в User модель вместо MyUser (имя пользователя и пароль верны). Или это что-то другое?

Что я делаю не так? Это пример из http://scottbarnham.com/blog/2008/08/21/extending-the-django-user-model-with-inheritance/

1 Ответ

4 голосов
/ 16 февраля 2010

Вопреки тому, что говорится в сообщении в блоге, на которое вы ссылаетесь, хранение таких данных в модели профиля все еще является рекомендуемым способом в Django.У подкласса User есть все виды проблем, одна из которых - та, с которой вы сталкиваетесь: Django не знает, что вы создали подкласс User, и с удовольствием создает и читает User модели в базе кода Django.То же самое верно для любого другого стороннего приложения, которое вы хотели бы использовать.

Посмотрите этот тикет на трекере проблем Django, чтобы получить некоторое понимание основных проблем подкласса User

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...