[英]Django User Type Definition
在 Django 中:从 Python OO 的角度来看,如果我想要不同类型的用户,我不应该拥有从 AbstractUser 扩展的“教师”对象类型和“学生”对象类型吗?
看起来所有的解决方案都提到只是扩展了两个用户所需的所有字段,并且只在表单时间使用教师或学生所需的字段。 只是试图坚持使用 OO 方法,从新手的角度来看这对我来说很有意义。 拥有不同的对象类型将允许我测试对象的类型而不是查看属性,并且只有对象中定义的每种类型所需的字段。
有没有正确的方法来做到这一点,所以我有不同对象类型的用户? 我可以在用户模型中嵌入一个教师或学生类型的对象作为字段吗? 只是猜测? 让我知道您能做什么,并感谢您的专业礼貌回复和耐心。
这是一个很好的解决方案吗? https://github.com/mishbahr/django-users2
这是我在互联网上看到的反复出现的主题... django 创建多种类型用户的最佳方法
这有点像为用户分配配置文件。 我这样做的方式是自定义用户模型上的type
字段,然后根据该类型创建Teacher
或Student
的相关模型。
看看那里的django-users2
代码的年龄,我不会使用它,因为它已经有 6 或 7 年的历史了。 你可能会通读它并调整它的概念,但我不会按原样使用它。
我创建与用户关联的配置文件的方式是通过这样的信号;
from django.contrib.auth import get_user_model
from django.db.models.signals import post_save
from django.dispatch import receiver
from ..models import Profile
@receiver(post_save, sender=get_user_model())
def auto_create_profile(instance, **kwargs):
"""
Anytime a User object is created, create the associated Profile object
alongside it
"""
if kwargs.get('created', False):
Profile.objects.create(
user=instance
)
所以你也可以调整它来检查类型;
if kwargs.get('created', False):
if instance.type == 'teacher':
Teacher.objects.create(
user=instance
)
然后你的模型只需要一个指向用户的链接,这作为OneToOneField
是有意义的;
class Profile(models.Model):
"""
Profile model
"""
class Meta:
"""
Metadata
"""
app_label = 'accounts'
verbose_name = _('User profile')
verbose_name_plural = _('User profiles')
user = models.OneToOneField(
verbose_name=_('User'),
to=settings.AUTH_USER_MODEL,
related_name='profile',
on_delete=models.CASCADE
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.