【问题标题】:Django model extending Default User model (one-to-one field), how to create reg form for all combined model fieldsDjango模型扩展默认用户模型(一对一字段),如何为所有组合模型字段创建reg表单
【发布时间】:2017-03-19 05:16:50
【问题描述】:

我正在使用 Django 1.10.*。这是我的用户资料模型:

class student(models.Model):
    user = models.OneToOneField(User, primary_key=True, on_delete=models.CASCADE)
    state = models.CharField(max_length=21, null=True, blank=True, choices=in_states.STATE_CHOICES)
    city = models.CharField(max_length=21, null=True, blank=True)
    date_joined = models.DateTimeField(default=timezone.now)
    educational_role = models.CharField(max_length=39, choices=EDUCATIONAL_ROLE)
    institute = models.ForeignKey(educational_institute, null=True, blank=True)
    language = models.CharField(max_length=8, choices=LANGUAGES)

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        student.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.profile.save()

当我为学生创建表单类并使用它在我的视图中创建一个扩展 FormView 类的视图类时,将form 上下文传递给 HTML 模板,如下所示:

forms.py:

class RegistrationForm(forms.ModelForm):
    class Meta:
        model = student
        fields = ['user', 'state', 'city', 'educational_role', 'institute', 'language']

views.py:

class Register(FormView):
    template_name = 'searcher/register.html'
    form_class = RegistrationForm

    def get_context_data(self, **kwargs):
        context = super(Register, self).get_context_data(**kwargs)
        context['applink'] = applink
        context['forumlink'] = forumlink
        return context

那么我需要如何修改它,以便注册表要求User 模型的usernamefirstnameemail 以及student 模型添加的字段,并可以选择创建一个新的educational_institute,如果它不存在?

【问题讨论】:

    标签: python django django-forms django-templates django-views


    【解决方案1】:

    您可以使用multi-table inheritance django.contrib.auth.models.User。看起来像这样:

    from django.contrib.auth.models import User
    
    class Student(User):
        state = models.CharField(...)
        ...
    

    这样,ModelFormUpdateView 等所有 Django 功能都可以正常运行,而无需任何额外的摆弄。在后面,Django 将为您创建完全相同的OneToOneField

    如果您的所有用户都是学生,您也可以replace the auth user model entirely

    如果您不想执行任何这些操作,则需要在表单中添加其他字段,如果您使用 Meta,请指定它们,注意设置它们的默认值(以 __init__ 为例) , cleaning 这些字段,并将模型保存在 OneToOneField 后面,全部由您自己完成。

    【讨论】:

    • 是的,我明白你的意思,但是出于身份验证的目的,我发现直接扩展 AbstractUser 类而不是 User: class Student(AbstractUser): 要好得多。你说什么?
    • 这两个选项之间唯一的细微差别是,如果您从 AbstractUser 继承,您的用户模型将不再可交换:github.com/django/django/blob/master/django/contrib/auth/… 它不会受到伤害,但您可能永远也不会想换它。但是,以防万一 Django 家伙将来改变某些东西,我仍然希望完全继承自 User
    • 如果我从User 类扩展,您能否提供有关如何创建 userchangeform、usercreationform、注册视图的完整指南(其中也包括 MyUser 的所有附加字段)。还有什么放入admin.py 页面?
    猜你喜欢
    • 2015-09-26
    • 2017-08-07
    • 2011-05-21
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 2019-05-12
    • 1970-01-01
    • 2016-11-09
    相关资源
    最近更新 更多