Django - Как добавить дополнительные поля в модель User?
Мне нужно добавить новые поля в "реальную модель Django User". Почему? Потому что у меня есть две формы в моем шаблоне с методами post на двух разных страницах.
И я создал две модели, каждая из которых сохраняет данные соответствующей формы в базе данных.
В моих представлениях мне пришлось написать две разные функции для страниц форм.
1-й: когда есть пост запрос, он сохраняет данные в 1-й Модели.
Вторая: Делает то же самое, что и 1-й, но сохраняет данные в 2-й модели .
Я пытался создать еще одну новую модель model3, которая содержит поля model1 + model2 (не удалял предыдущие модели)! Но когда я отправляю 1-ю форму, она сохраняет данные в объекте, а когда я отправляю 2-ю форму, данные сохраняются в другом новом объекте model3 !
Так что я отменил этот метод и теперь я должен попробовать другой способ сделать задачу, Итак, я сохранил данные 1-ой формы (которые являются информацией для входа (email, pass) и когда пользователь отправляет форму, она создает нового пользователя с
user = User.objects.create_user(request.POST.get("email"),request.POST.get("email"),password)
Это сработало отлично, и теперь я могу изменять учетные данные в представлениях только user.username = newemail и user.password = newpassword... но я не смог сделать это со второй формой, потому что модель User имеет не так много полей, как Model2! И также, когда я пробую это с
data = Model3(fielname = request.POST.get("addressLineForExample")
data.save()
выдает ошибку, говоря, что я не указал, для какого идентификатора пользователя я собираюсь сохранить его!
Я видел видео и документацию о методе OneToOneField! Потом я понял, что он просто показывает поля model3 на странице пользователя в 127.0.0.1:8000/admin, а не добавляет реальные поля в User Model!
Мне пришла идея изменить user.newaddedfield = любое поле Model3! Я просто хочу реализовать это таким образом!
Надеюсь, вы поняли, что я написал... Я не мог выложить картинки или код, потому что там есть лишний не нужный код, поэтому я постарался сделать это как можно понятнее!
Я очень ценю тех, кто хотя бы пытается помочь. И Заранее спасибо.
Вы можете расширить модель Django AbstractUser
, чтобы создать свою собственную пользовательскую модель пользователя поверх модели Django User
. Например:
Файл: project/user/models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
custom_field = models.BooleanField(default=False)
Затем необходимо выполнить
python manage.py makemigrations
python manage.py migrate
в вашем терминале для создания связанной модели в базе данных.
Чтобы увидеть эту модель на странице администратора, зарегистрируйте модель с помощью следующего фрагмента:
Файл: project/user/admin.py
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User
admin.site.register(User, UserAdmin)
P.S. Я настоятельно рекомендую добавить
.AUTH_USER_MODEL = "user.User"
кproject/project/settings.py
для того, чтобы иметь возможность полностью использовать стандартные пользовательские функции Django (включая интеграцию аутентификации Django Rest Framework).P.S. Убедитесь, что имя приложения указано в
.INSTALLED_APPS
в вашемsettings.py
Решение:
Я вернулся назад с созданием другой новой модели3, которая содержит поля модели1 + модели2
Затем, когда я отправляю первую форму, я делаю:
data = Model3(field1 = request.POST.get("ValueOfThe1stFormField1")
data.save()
Теперь модем Model3 будет заполнен данными первой формы, но еще не заполнен данными второй.
Во второй функции, где пользователь должен отправить данные во второй форме, я делаю обновление связанного объекта model3 следующим образом:
Model3.objects.filter(field1=field1OfThe1stForm).update(field2=anything, field3=anything,...)
Надеюсь, это поможет всем, кто пытается объединить две (или более) модели в одну другую модель, которая должна содержать все поля предыдущей модели.