Seletach
@Seletach
Начинающий бекендер

Как зарегистрировать новый объект User в расширенную модель MyUser при помощи CreateView?

Я расширил модель User, теперь эта модель имеет поля помимо дефолтных: bio, status, campus, group, birth_date.
Superuser в модель я добавил через консоль.

Реализуя авторизацию, при попытке создать нового пользователя через встроенную форму UserCreationForm, появляется вот такая ошибка:
Manager isn't available; 'auth.User' has been swapped for 'users.MyUser'


Головной urls:
urlpatterns = [
    path('auth/', include('django.contrib.auth.urls')),

    path('auth/registration/', CreateView.as_view(
        template_name='registration/registration_form.html',
        form_class=UserCreationForm,
        success_url=reverse_lazy('blog:index')),
        name='registration'),
]


Форма в registration_form:
<form method="post">
        {% csrf_token %}
        {{ form }}
        <input type="submit" value="Зарегестрироваться" />
</form>


Модель MyUser:
class MyUser(AbstractUser):
    """Расширенный профиль."""
    bio = models.TextField('Биография', blank=True)
    status = models.CharField(max_length=MAX_LENGHT, blank=True)
    campus = models.CharField(
        max_length=MAX_LENGHT,
        help_text='Колледж/ Институт')
    group = models.CharField(
        max_length=MAX_LENGHT,
        blank=True,
        help_text='Группа, например: ТД-22-3')
    birth_date = models.DateField(null=True, blank=True)


В settings константу обновил: AUTH_USER_MODEL = 'users.MyUser'
  • Вопрос задан
  • 46 просмотров
Решения вопроса 1
Mike_Ro
@Mike_Ro
Python, JS, WordPress, SEO, Bots, Adversting
Если я правильно понял задачу, то как то так:
# MyUser
from django.contrib.auth.models import AbstractUser
from django.db import models

class MyUser(AbstractUser):
    # ...
    class Meta:
        swappable = 'AUTH_USER_MODEL'

# MyUserCreationForm
from django import forms
from django.contrib.auth.forms import UserCreationForm
from .models import MyUser

class MyUserCreationForm(UserCreationForm):
    class Meta:
        model = MyUser
        fields = ('username', 'password1', '...')

# view
from django.urls import reverse_lazy
from django.views.generic.edit import CreateView
from .forms import MyUserCreationForm
from .models import MyUser

class MyUserCreateView(CreateView):
    model = MyUser
    form_class = MyUserCreationForm
    template_name = 'registration/registration_form.html'
    success_url = reverse_lazy('blog:index')

# urls
from django.urls import path, include
from .views import MyUserCreateView

urlpatterns = [
    path('auth/', include('django.contrib.auth.urls')),
    path('auth/registration/', MyUserCreateView.as_view(), name='registration'),
]
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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