Здравствуйте! Я новичок в Django, и, возможно, мой вопрос не совсем корректный. У меня есть код, который позволяет регистрировать пользователя, входить в систему с получением токена, а также просматривать информацию по токену и выходить из аккаунта. Как я могу создать кастомную модель пользователя с дополнительными полями, такими как имя, фамилия и возраст?
Вот ссылка на инструкцию и код: <a href="https://github.com/FlDanyT/my_Django_documentation/tree/main" rel="nofollow">https://github.com/FlDanyT/my_Django_documentation...</a>
Код моделей выглядит следующим образом:
<br/> models.py <br/>
<pre><code class="python">import secrets
from django.db import models
from django.contrib.auth.models import User # Встроенная модель пользователя Django
class UserToken(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='token')
token = models.CharField(max_length=64, unique=True, blank=True)
def generate_token(self):
self.token = secrets.token_hex(32) # Генерируем безопасный токен
self.save()
return self.token
def __str__(self):
return f'Token for {self.user.username}' # Ответ серверу</code></pre>
<br/> Код сериализаторов: <br/>
<pre><code class="python">from django.contrib.auth.models import User
from rest_framework import serializers
from .models import UserToken
class UserRegisterSerializer(serializers.ModelSerializer):
password = serializers.CharField(write_only=True, min_length=8)
class Meta:
model = User
fields = ['username', 'email', 'password']
def create(self, validated_data):
user = User.objects.create_user(**validated_data)
UserToken.objects.create(user=user) # Создаем токен для пользователя
return user
class UserLoginSerializer(...</code></pre>
Для создания кастомной модели пользователя с дополнительными полями в Django, следует использовать `AbstractUser` или `AbstractBaseUser` в качестве базового класса. В вашем случае, с учетом того, что вы хотите добавить только несколько полей к существующей модели пользователя, проще всего использовать `AbstractUser`.
### Шаги для создания кастомной модели пользователя:
1. **Создайте кастомную модель пользователя**:
В вашем файле `models.py` создайте модель, которая будет наследовать от `AbstractUser`. Добавьте необходимые поля, такие как имя, фамилия и возраст.
```python
from django.contrib.auth.models import AbstractUser
from django.db import models
class CustomUser(AbstractUser):
first_name = models.CharField(max_length=30, blank=True)
last_name = models.CharField(max_length=30, blank=True)
age = models.PositiveIntegerField(null=True, blank=True)
def __str__(self):
return self.username
```
2. **Обновите настройки Django**:
Укажите вашу кастомную модель пользователя в настройках Django. В файле `settings.py` добавьте:
```python
AUTH_USER_MODEL = 'your_app_name.CustomUser'
```
Не забудьте заменить `your_app_name` на имя вашего приложения.
3. **Миграции**:
После создания новой модели выполните миграции для обновления базы данных:
```bash
python manage.py makemigrations
python manage.py migrate
```
4. **Обновите сериализаторы**:
Теперь необходимо обновить сериалиаторы, чтобы они работали с вашей кастомной моделью пользователя:
```python
from .models import CustomUser, UserToken
from rest_framework import serializers
class UserRegisterSerializer(serializers.ModelSerializer):
password = serializers.CharField(write_only=True, min_length=8)
class Meta:
model = CustomUser # Используем кастомную модель пользователя
fields = ['username', 'email', 'password', 'first_name', 'last_name', 'age']
def create(self, validated_data):
user = CustomUser.objects.create_user(**validated_data)
UserToken.objects.create(user=user) # Создаем токен для пользователя
return user
```
5. **Создание токена**:
Модель `UserToken` уже правильно настроена для связи с пользователем через `OneToOneField`, так что изменений здесь вносить не нужно.
6. **Адаптация логики входа и выхода**:
Также убедитесь, что ваш код для логики входа и выхода из системы использует кастомную модель пользователя.
### Пример кода для регистрации пользователя:
Теперь, когда вы уже настроили кастомную модель пользователя и сериализаторы, ваш код для регистрации пользователей, входа и управления токенами может выглядеть следующим образом:
```python
# views.py
from rest_framework import generics
from .serializers import UserRegisterSerializer, UserLoginSerializer
class UserRegisterView(generics.CreateAPIView):
serializer_class = UserRegisterSerializer
```
Таким образом, вы создали кастомную модель пользователя с дополнительными полями и установили связь с токеном. Не забудьте протестировать функциональность приложения, чтобы убедиться, что все работает корректно.
Перво-наперво вам всё-таки нужно создать желаемую модель юзера, унаследовав её от django.contrib.auth.models.AbstractUser.
Эту модель (традиционно назовём её CustomUser) нужно зарегистрировать в settings.py:
AUTH_USER_MODEL = 'your_app.CustomUser'
И это, собственно, и всё.
Однако, по всей вероятности, вам также понадобятся формы для админки
# your_app/forms.py from django import forms from django.contrib.auth.forms import UserCreationForm, UserChangeForm from .models import CustomUser class CustomUserCreationForm(UserCreationForm): class Meta: model = CustomUser fields = ... class CustomUserChangeForm(UserChangeForm): class Meta: model = CustomUser fields = ...
Потом это всё регистрируется в админке и готово, можно делать миграции и пользоваться. Главное, чтобы в остальном ваш проект был готов к замене модели юзера. Для этого документация рекомендует не хардкодить модель User, а получать её при помощи get_user_model (полезно читать всё-таки документацию).