Django: добавление свойства в класс User. Изменение его во время выполнения и UserManager.create_user - PullRequest
2 голосов
/ 08 июня 2009

По различным сложным причинам [1] мне нужно добавить дополнительные свойства в класс User Django.

Я не могу использовать ни Профиль, ни способ наследования. (Как в Расширение модели пользователя с помощью пользовательских полей в Django )

Итак, я включил класс User в мой файл local_settings. И добавив к этому свойство там.

Это, возможно, удивительно, похоже, работает во многих случаях. Но не тогда, когда я создаю нового пользователя из UserManager.create_user (). Поэтому мне нужно исправить альтернативу методу UserManager.create_user (). Глядя на источник этого (в contrib.auth.models.py), я обнаружил, что класс, который он использует для создания пользователя, хранится в свойстве с именем UserManager.model, а не на него ссылаются напрямую.

Строка такая:

user = self.model (Нет, имя пользователя, '', '', email.strip (). Lower (), 'placeholder', False, True, False, сейчас, сейчас)

Проблема в том, что этот self.model (который, как я полагаю, содержит ссылку на класс User), похоже, не является моей исправленной версией.

Итак, кто-нибудь знает, где настроен этот self.model в случае UserManager? И правильно ли я предположил, что на тот момент код не прошел local_settings, поэтому мой патч для класса User отсутствует? А если есть лучшее место для патча класса?

ура

фил

[1] Чтобы удовлетворить ограничения IOUs. Мне нужно, чтобы класс User использовал другую и существующую таблицу в базе данных, которая имеет дополнительные поля и ограничения.

Обновление: для дальнейшего использования, похоже, что прокси-модели - это способ, которым Django собирается поддерживать то, что мне нужно: http://code.djangoproject.com/ticket/10356

Ответы [ 3 ]

2 голосов
/ 08 июня 2009

Возможно, вам просто нужно убедиться, что вы делаете исправление замены / добавления / обезьяны как можно раньше (до того, как приложение auth будет фактически установлено). Проблема, однако, в том, что классовые модели делают некоторые вещи мета-класса, которые, вероятно, объясняют, почему UserManager имеет неправильный класс - так как он сгенерирует исходный класс, настройте UserManager с этим классом, а затем вы сделаете свое дело и все будет по-другому.

Короче говоря, будьте жестоки, когда вы замените класс. Если вы можете расширить исходный класс, то замените исходный на расширенную версию:


import django.contrib.auth.models
from django.contrib.auth.models import User as OriginalUser

class User(OriginalUser):
    pass # add your extra fields etc

# then patch the module with your new version
django.contrib.auth.models.User = User

Или, если это не сработает, продублируйте класс User в своем новом классе, а затем исправьте его.

Это все немного грязно, но может делать то, что вы хотите.

2 голосов
/ 09 июня 2009

Если бета-версия Django 1.1 не слишком для вас, попробуйте прокси-модели.

2 голосов
/ 08 июня 2009

Обычный способ получения пользовательских полей для сайта - это указание таблицы профиля пользователя в файле settings.py. Затем вы можете получить конкретные настройки с помощью метода u.user_profile (). Это очень хорошо задокументировано в документации.

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