首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将自定义用户模型字段从父类继承到两个不同应用程序之间的子类。

将自定义用户模型字段从父类继承到两个不同应用程序之间的子类。
EN

Stack Overflow用户
提问于 2022-10-23 20:41:45
回答 1查看 43关注 0票数 0

你好国王和王后!

我在做一个项目,却被一个复杂的问题困住了。我有一个模型(generalpage.models),其中存储了关于用户的所有公共信息。在另一个应用程序(profilesettings)中,我有一个应用程序,其中所有的配置文件页面相关功能都将被编码。

我试图将generalpage.models中的User类中的模型字段继承到profilesettings.models中,只需编写UserProfile(User)。当我这样做时,管理面板中创建了一个空表单。因此,基本上,已经存储的generalpage.models信息没有继承到profilesettings.models中,我在数据库中创建了一个完整的新表。

我的问题是:

  1. 可以为自定义用户模型创建抽象类吗?
  2. 是否有正确的方法来处理类并在profilesettings.models中创建一个方法,用用户类创建的数据库中已经存储的数据填充UserProfile窗体?

有人能解释一下信息如何在不创建新的空表单的情况下从一个应用程序传递到另一个应用程序吗?

文件结构:

管理面板:

generalpage.models:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
from generalpage.models import User, UserInfo, Room, Message, Topic
from django.db import models

class UserProfile(User):
    pass
    
class Settings(UserInfo):
    pass

在@viktorblindh建议之后,我的模型是:

对于admin.py:

代码语言:javascript
运行
复制
from django.contrib import admin    
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from profilesettings.models import UserProfile
from generalpage.models import User

class UserProfileInline(admin.StackedInline):
    model = UserProfile
    min_num = 1

class UserProfileAdmin(BaseUserAdmin):
    inlines = [UserProfileInline, ]


admin.site.register(User, UserProfileAdmin)

# admin.site.register(UserProfile)
# admin.site.register(Settings)

对于profilesettings.models:

代码语言:javascript
运行
复制
from generalpage.models import User, UserInfo, Room, Message, Topic
from django.db import models
from django.conf import settings

class UserProfile(User):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
class Settings(UserInfo):
    pass

建议的解决办法如下:

https://stackoverflow.com/questions/42424955/how-to-exchange-data-between-apps-in-django-using-the-database

解决了我的问题。

代码语言:javascript
运行
复制
EN

Stack Overflow用户

发布于 2022-10-23 21:50:45

也许我误解了手头的问题,但对我来说,这听起来像是你想要在你的profilesettings.UserProfile上有一个profilesettings.UserProfile键到你的generalpage.user上。我假设每个用户都有自己独特的简介。

代码语言:javascript
运行
复制
from django.conf import settings    

class UserProfile(User):
        user(models.OneToOneField(
        settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

然后,您可以在generalpage.admin中使用inlineformset来获取以相同形式显示的所有信息。

代码语言:javascript
运行
复制
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)
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74174619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档