Django模型扩展默认用户模型(一对一字段),如何为所有组合模型字段创建reg表单

时间:2016-11-05 12:52:58

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

我正在使用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()

当我为学生创建表单类时,使用它创建一个View类,在我的视图中将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

因此,我如何修改此内容,以便注册表单要求username模型的firstnameemailUser以及{{{}}添加的字段1}}模型并具有创建新student的选项(如果它已经不存在)?

1 个答案:

答案 0 :(得分:0)

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

from django.contrib.auth.models import User

class Student(User):
    state = models.CharField(...)
    ...

这样,所有Django功能(例如ModelFormUpdateView)都可以在没有任何额外功能的情况下运行。在后面,Django将为您创建完全相同的OneToOneField

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

如果您不想执行其中任何操作,则需要在表单中添加其他字段,如果您构成Meta则指定它们,请注意设置其默认值(在{{ 1}}在示例中),cleaning这些字段并将模型保存在__init__之后。