如果你不想改變AUTH_USER_MODEL它有許多副作用,您可以使用Multi-table inheritance和子類用戶模型代替AbstractUser的。這將創建一個OneToOneField命名user_ptr指向用戶表學生表。
下面是一個例子
from django.contrib.auth.models import User
from django.db import models
from django.utils.translation import gettext_lazy as _
class Student(User):
phone = models.CharField(max_length=25)
birthdate = models.DateField(null=True)
city = models.CharField(max_length=50)
personalInfo = models.TextField()
class Meta:
verbose_name = _('student')
verbose_name_plural = _('students')
現在你可以定義你的ModelForm這樣
class StudentForm(forms.ModelForm):
class Meta:
model = Student
fields = ('first_name', 'last_name', 'username',
'personalInfo', 'phone', 'birthdate', 'city')
您還可以擴展內置在Django用戶表單這樣
from django.contrib.auth.forms import UserChangeForm
class StudentForm(UserChangeForm):
class Meta:
model = Student
fields = ('first_name', 'last_name', 'username',
'personalInfo', 'phone', 'birthdate', 'city')
要在django admin中使用你的表單,添加t他對以下admin.py的:
from django.contrib import admin
from .views import StudentForm
from .models import Student
class StudentAdmin(admin.ModelAdmin):
form = StudentForm
admin.site.register(Student, StudentAdmin)
按分分級的用戶模型,創建學生情況下會自動創建一個新的用戶實例,但不是周圍的其他方式。因此,一個實例可以存在而不與一個學生實例相關聯。如果你想確保學生實例系統中的每一個用戶創建,您可以使用以下信號:
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import Student
@receiver(post_save, sender=User)
def create_student(sender, instance, created, **kwargs):
if created:
student = Student(user_ptr_id=instance.pk)
student.__dict__.update(instance.__dict__)
student.save()
如果學生模型繼承了用戶模型,你只需要一個的ModelForm。 – 2018-01-26 10:27:19
@KevinL。,如果你在一個答案中詳細說明這一點,那將是非常棒的:-) – cel 2018-01-27 07:41:21
@cel AFAIK,在Django核心中沒有像這樣的發展。這裏的'自動'解決方案可能不是微不足道的,並且涉及編寫自己的自定義模型表單類或混合類來執行此操作。這比使用建議的方法要複雜得多(可以說更脆弱)。一個可能的解決方案可能包含在[這個回答](https://stackoverflow.com/a/41559015/5747944)中,該解決方案描述了一個ModelForm mixin,它允許定義第二個「子」模型並聲稱與通用視圖兼容。 – sytech 2018-01-31 14:20:33