Расширить модель Django User (заставить ее работать в request.user), Django 1.2.3 - PullRequest
0 голосов
/ 30 ноября 2010

Я хотел бы расширить модель User, чтобы я мог добавить некоторые дополнительные поля и функции (не только поля, имейте в виду, либо (ну, все же) я мог бы использовать get_profile (), который, я думаю,ужасно).

Также я хотел бы использовать эту новую расширенную модель пользователя в request.user, например:

Расширенная модель пользователя:

# imports etc

class CustomUser(User):
    extra_field = ...

    def extra_function(self):
        ...

        return ...

Пример использования вида:

# imports etc

def extra_function_view(request):
    print request.user.username
    print request.user.extra_field

    request.user.extra_function()

    return HttpResponse( ... )

Вышеприведенный код явно не работает, потому что extra_field и extra_function отсутствуют в модели User.

Теперь я нашел метод для этого, используя сервер аутентификации,что довольно сложно, и что я не смог заставить работать в Django 1.2.3.

AUTHENTICATION_BACKENDS = (
    'myproject.auth_backends.CustomUserModelBackend',
)
...

CUSTOM_USER_MODEL = 'accounts.CustomUser'

Далее мы попробовали другие методы, такие как использование сигналов, которые не работали.Мне кажется, что единственное решение заключается в настройке модели User в Django (что не является элегантным решением, корректирующим исходный код Django, но является разумным решением для кода).

Поэтому я ищурешение для этого .. кто-нибудь делал это раньше?

Спасибо, пока

Стефан

1 Ответ

2 голосов
/ 30 ноября 2010

Вы на правильном пути с настройкой Backend аутентификации.

Backends аутентификации может быть довольно простым, вот наш фрагмент, который мы используем в нашем проекте.

class LocalAccount(object):
    def authenticate(self, system=None, username=None, password=None):
        try:
            user = User.objects.get(system=system, alias=username)
            if user.check_password(password):
                return user
        except User.DoesNotExist:
            return None

    def get_user(self, user_id):
        'returns user'

    def get_all_permissions(self, user_obj):
        'returns user permissions'

    def has_perm(self, user_obj, perm):
        'verifies permission, remember you can hardcode these'

    def get_group_permissions(self, user_obj):
        return set() #We don't use this

    def has_module_perms(self, user_obj, app_label):
        return False

Это позволяет вам возвращать любую модель пользователя, которую вы хотите вернуть.Пока ваша пользовательская модель в основном похожа на пользовательскую модель Django, вы не столкнетесь с какими-либо проблемами.

Также имейте в виду, что расширение пользователя и включение приложения вызовут как модель пользователя Django, так и собственную модель пользователябыть в базе данных с наследованием модели.Лучший вариант - скопировать модель пользователя Django и изменить ее.Для нашего проекта мы даже не включаем 'auth' в настройку установленных приложений.

Концепция здесь - Python duck typing .До тех пор, пока созданная вами модель User имеет тот же интерфейс, который ищет Django (методы, поля), не имеет значения, действительно ли это класс User, указанный в ней.

...