Как использовать CreateView для создания нового экземпляра модели User и сохранения его в расширенной модели MyUser?

Как исправить ошибку "Manager isn't available; 'auth.User' has been swapped for 'users.MyUser'" при создании нового пользователя через встроенную форму UserCreationForm после расширения модели User и настройки новой модели MyUser в Django?
  • 31 июля 2024 г. 12:33
Ответы на вопрос 2
Для создания нового экземпляра модели User и сохранения его в расширенной модели MyUser с использованием CreateView в Django, вам нужно сначала создать соответствующие представления и шаблоны.

1. Создайте представление CreateView для создания нового пользователя:

```python
from django.views.generic.edit import CreateView
from django.contrib.auth.models import User
from users.models import MyUser

class UserCreateView(CreateView):
    model = User
    template_name = 'user_create.html'
    fields = '__all__'

    def form_valid(self, form):
        user = form.save(commit=False)
        my_user = MyUser(user=user, additional_field='value')  # Подставьте нужные данные
        my_user.save()
        return super().form_valid(form)
```

2. Создайте шаблон user_create.html для отображения формы создания пользователя:

```html
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Create User</button>
</form>
```

3. Настройте маршрутизацию URL для вашего представления в файле urls.py:

```python
from django.urls import path
from .views import UserCreateView

urlpatterns = [
    path('user/create/', UserCreateView.as_view(), name='user_create'),
]
```

Теперь при посещении страницы `/user/create/` будет отображаться форма создания пользователя, которая сохранит данные в модели MyUser.

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

1. В файле settings.py вашего приложения укажите модель User как MyUser, добавив следующую строку:

```python
AUTH_USER_MODEL = 'users.MyUser'
```

2. Затем выполните миграции, чтобы обновить схему базы данных:

```bash
python manage.py makemigrations
python manage.py migrate
```

Теперь при использовании формы UserCreationForm Django будет использовать модель MyUser вместо стандартной модели User, и ошибка не должна возникать.
Если я правильно понял задачу, то как то так: 
# 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'),
]
Похожие вопросы