Задать вопрос
@artinnok
бекенд-программист

Как исправить такое (UserCreationForm, AbstractUser)?

Сделал регистрацию на сайте таким образом:

1) Расширил модель пользователя, добавив поле для телефона:
class User(AbstractUser):
    phone = models.CharField(max_length=50)


2) Прописал в settings.py
AUTH_USER_MODEL='myapp.User'

3) manage.py makemigrations

4) manage.py migrate

5) Кастомизировал форму UserCreationForm:
class CreateForm(UserCreationForm):
    error_messages = {
        'duplicate_username': "Пользователь с таким именем уже существует",
        'password_mismatch': "Введенные пароли не совпадают"
    }

    username = forms.RegexField(label="Имя пользователя:", max_length=30,
        regex=r'^[\w.@+-]+$', widget=forms.TextInput(attrs={'class': 'form-control'}))

    password1 = forms.CharField(label="Пароль:",
        widget=forms.PasswordInput(attrs={'class': 'form-control'}))

    password2 = forms.CharField(label="Повторите пароль:",
        widget=forms.PasswordInput(attrs={'class': 'form-control'}))


6) Написал контроллер:
def signup(request):
    if request.method == 'POST':
        form = CreateForm(request.POST)
        if form.is_valid():
             username = cleaned_data['username']
             password = cleaned_data['password1']
             User.objects.create_user(username=username, password=password)
        return redirect('/success/')
    elif request.method == 'GET':
        form = CreateForm()
        return render(request, 'core/signup.html', {'form': form})


В итоге, выдает ошибку:
Exception Type: ProgrammingError at /signup/
Exception Value: relation "auth_user" does not exist
LINE 1: SELECT (1) AS "a" FROM "auth_user" WHERE "auth_user"."userna...
                               ^


Я посмотрел исходники:
Там напрямую используют класс django.contrib.auth.models.User, который я заменил своим классом User - подумал, что ошибка в этом и вставил костыль:

Добавил в myapp.forms следующее:
from myapp.models import User

А в CreateForm:
class Meta:
         model = User
         fields = ("username",)


P.S. Замечу, что при миграции были ошибки. Рубил с плеча - удалил все миграции и базу. Создал базу и создал миграции. Мигрировал - все ОК.

Все работает, но не хочу я делать таким образом.
Как быть?
  • Вопрос задан
  • 1109 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
@maxfox
В доке написано:
UserCreationForm
Depends on the User model. Must be re-written for any custom user model.

Т.е. нужно переписать форму. И это не единственное, что нужно переписать. Собственно, в доке все расписано.
Если задача только в том, чтобы хранить дополнительную инфу о пользователе, то проще сделать отдельную модель UserProfile и связать её с основной OneToOne.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы