Наследование полей пользовательской модели пользователя от родительского класса к дочернему классу между двумя различными приложениями
Здравствуйте короли и королевы!
Я работаю над проектом и застрял на (для меня) сложном вопросе. У меня есть одна модель (generalpage.models), где хранится вся общая информация о пользователях. В другом приложении (profilesettings) у меня есть приложение, где будут закодированы все функции, связанные со страницей профиля.
Я пытался унаследовать поля модели из класса User в generalpage.models в profilesettings.models, просто написав UserProfile(User). Когда я это сделал, в админпанели создалась пустая форма. То есть, по сути, информация, которая уже хранилась в generalpage.models, не была унаследована в profilesettings.models, я создал целую новую таблицу в базе данных.
мои вопросы:
- Можно ли создать абстрактный класс для пользовательской модели пользователя?
- Есть ли правильный способ обработки классов и создания метода в profilesettings.models, который заполняет форму UserProfile данными, уже хранящимися в базе данных, созданной классом User?
Может кто-нибудь объяснить, как информация может быть передана из одного приложения в другое без создания новой пустой формы?
Filestructure:
Панель администратора:
generalpage.models:
from random import choices
from secrets import choice
from unittest.util import _MAX_LENGTH
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, User, PermissionsMixin
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from generalpage.managers import CustomUserManager
from django.conf import settings
from generalpage.managers import CustomUserManager
# Create your models here.
sex_choices = ( ("0", "Man"),
("1", "Kvinna"),
("2", "Trans")
)
class User(AbstractBaseUser, PermissionsMixin):
user = models.CharField(settings.AUTH_USER_MODEL, null=True, max_length=50)
username = models.CharField(_("Användarnamn"), max_length=100, null=True, unique=True)
age = models.IntegerField(_("Ålder"),null=True, blank=False)
email = models.EmailField(_("E-mail"), unique=True, null=False)
country = models.CharField(_("Land"),max_length=50, null=True, blank=True)
county = models.CharField(_("Län"),max_length=50, null=True, blank=True)
city = models.CharField(_("Stad"),max_length=50, null=True, blank=True)
sex = models.CharField(_("Kön"), choices=sex_choices, null=True, blank=False, max_length=50)
profile_picture = models.ImageField(_("Profilbild"),null=True, blank=True, default="avatar.svg", upload_to = "static/images/user_profile_pics/")
is_staff = models.BooleanField(default=False)
is_active = models.BooleanField(default=False)
date_joined = models.DateTimeField(default=timezone.now)
USERNAME_FIELD = 'username' # defines the unique identifier for the User model
REQUIRED_FIELDS = ["email"] # A list of the field names that will be prompted for when creating a user via the createsuperuser management command
objects = CustomUserManager()
def __str__(self):
return self.username
profilesettings.models:
from generalpage.models import User, UserInfo, Room, Message, Topic
from django.db import models
class UserProfile(User):
pass
class Settings(UserInfo):
pass
Возможно, я неправильно понимаю суть вопроса, но мне кажется, что вы хотите иметь ключ OneToOne в profilesettings.UserProfile для generalpage.user. Я предполагаю, что у каждого пользователя есть свои уникальные profilesettings.
from django.conf import settings
class UserProfile(User):
user(models.OneToOneField(
settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
Затем вы можете использовать inlineformset в вашем generalpage.admin, чтобы получить всю информацию, отображаемую в одной форме.
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from profilesettings.models import UserProfile
class UserProfileInline(admin.StackedInline):
model = UserProfile
min_num = 1
class UserProfileAdmin(BaseUserAdmin):
inlines = [UserProfileInline, ]
admin.site.register(User, UserProfileAdmin)