Django: UserCreationForm не получает пользовательский класс пользователя - PullRequest
0 голосов
/ 27 января 2020

Я новичок в Django, и у меня возникла странная проблема. Используя Django 2.2.5, я создал пользовательский класс User, подклассифицированный из AbstractBaseUser. Помимо расширения AbstractBaseUser, единственным существенным изменением, которое я сделал, было удаление поля username и добавление моего собственного (не буду вдаваться в причину здесь). Я также добавил USERNAME_FIELD = "my new username" к модели.

Похоже, все это работало хорошо, и я смог создать пользователей. Затем я установил django-registration, чтобы использовать эту функциональность, и когда я попытался makemigrations, я столкнулся с этой ошибкой:

'django .core.exceptions.FieldError: Неизвестные поля («Мое новое имя пользователя») указано для User`

Теперь это не имеет никакого смысла для меня, поскольку модель явно имеет поле «Мое новое имя пользователя», и я указал Django следует использовать мою модель пользователя при настройке через AUTH_USER_MODEL. Я знал, что это работает, потому что вызов get_user_model() в оболочке вернул мою пользовательскую модель.

Теперь вот где это странно, я смог проследить проблему до django-registrations, RegistrationForm. Это форма, которая подклассов Django 'UserCreationForm. Когда RgistrationForm загружался или что-то в течение makemigrations, он выдавал ошибку, потому что ссылка на модель для формы была django.User, а не моя пользовательская модель пользователя. RegistrationForm не объявляет модель и использует UserCreationForm модель, которая оказывается User из django.contrib.auth.models.

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

Я очень смущен этим, поскольку get_user_model() ссылается на точно такой же параметр, и он работает.

На данный момент мне удалось это исправить, отредактировав модель RegistrationForm, добавив model = "Custom user model в django формы регистрации. Я бы предпочел не распространять пользовательскую версию этого пакета вместе с остальной частью сайта.

Есть идеи, что происходит с swappable, что может быть причиной этой проблемы?

Редактировать 27.01.19: Обновление Я попытался разбить на подклассы соответствующие django-registration классы, но оказалось, что простой импорт RegistrationForm вызывает проблему. Импорт UserCreationForm не сразу вызывает проблему, но если я пытаюсь проверить UserCreationForm.Meta.model."My new username", он выдает следующую ошибку:

AttributeError: тип объекта «Пользователь» не имеет атрибута «UVI_Handle»

Это согласуется с ошибкой выше. На данный момент я не уверен, что делать дальше. Я мог бы подкласс UserCreationForm, но ни один из django-registration не поймет это, так что, похоже, нет смысла его использовать, так как мне придется копировать все это.

1 Ответ

0 голосов
/ 27 января 2020

Вместо изменения кода пакета вы должны создать подкласс:

В случае, если ваша пользовательская модель совместима с поведением по умолчанию django -registration, (см. Ниже) вы будете возможность подкласса RegistrationForm, настроить его на использование своей пользовательской модели в качестве модели, а затем настроить представления в django -registration для использования подкласса формы. Например, вы могли бы сделать следующее (в модуле forms.py где-то в вашей кодовой базе - не редактировать напрямую код django -registration):

from registration.forms import RegistrationForm

from mycustomuserapp.models import MyCustomUser


class MyCustomUserForm(RegistrationForm):
    class Meta:
        model = MyCustomUser

Выше взято из здесь , вы также должны изменить URL-адреса, которые также описаны там.

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