Наследование полей пользовательской модели пользователя от родительского класса к дочернему классу между двумя различными приложениями

Здравствуйте короли и королевы!

Я работаю над проектом и застрял на (для меня) сложном вопросе. У меня есть одна модель (generalpage.models), где хранится вся общая информация о пользователях. В другом приложении (profilesettings) у меня есть приложение, где будут закодированы все функции, связанные со страницей профиля.

Я пытался унаследовать поля модели из класса User в generalpage.models в profilesettings.models, просто написав UserProfile(User). Когда я это сделал, в админпанели создалась пустая форма. То есть, по сути, информация, которая уже хранилась в generalpage.models, не была унаследована в profilesettings.models, я создал целую новую таблицу в базе данных.

мои вопросы:

  1. Можно ли создать абстрактный класс для пользовательской модели пользователя?
  2. Есть ли правильный способ обработки классов и создания метода в profilesettings.models, который заполняет форму UserProfile данными, уже хранящимися в базе данных, созданной классом User?

Может кто-нибудь объяснить, как информация может быть передана из одного приложения в другое без создания новой пустой формы?

Filestructure:

enter image description here

Панель администратора:

enter image description here

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)
Вернуться на верх