我正在使用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
模型的firstname
,email
,User
以及{{{}}添加的字段1}}模型并具有创建新student
的选项(如果它已经不存在)?
答案 0 :(得分:0)
您可以使用multi-table inheritance django.contrib.auth.models.User
。看起来像这样:
from django.contrib.auth.models import User
class Student(User):
state = models.CharField(...)
...
这样,所有Django功能(例如ModelForm
或UpdateView
)都可以在没有任何额外功能的情况下运行。在后面,Django将为您创建完全相同的OneToOneField
。
如果您的所有用户都是学生,您也可以replace the auth user model entirely。
如果您不想执行其中任何操作,则需要在表单中添加其他字段,如果您构成Meta
则指定它们,请注意设置其默认值(在{{ 1}}在示例中),cleaning这些字段并将模型保存在__init__
之后。