Nếu bạn không muốn thay đổi AUTH_USER_MODEL trong đó có nhiều tác dụng phụ, bạn có thể sử dụng Multi-table inheritance và phân lớp các mô hình tài thay vì AbstractUser. Điều này sẽ tạo ra một Student bảng với một OneToOneField tên user_ptr trỏ đến tài bảng.
Dưới đây là một ví dụ
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')
Bây giờ bạn có thể định nghĩa bạn ModelForm như thế này
class StudentForm(forms.ModelForm):
class Meta:
model = Student
fields = ('first_name', 'last_name', 'username',
'personalInfo', 'phone', 'birthdate', 'city')
Bạn cũng có thể mở rộng được xây dựng theo các hình thức sử dụng django như thế này
from django.contrib.auth.forms import UserChangeForm
class StudentForm(UserChangeForm):
class Meta:
model = Student
fields = ('first_name', 'last_name', 'username',
'personalInfo', 'phone', 'birthdate', 'city')
Để sử dụng biểu mẫu của bạn trong quản trị django, hãy thêm t ông sau để 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)
theo tiểu classing các tài mô hình, tạo ra một sinh viên dụ sẽ tự động tạo một đối tượng người dùng mới nhưng không phải là cách khác xung quanh. Vì vậy, một cá thể Người dùng có thể tồn tại mà không được liên kết với cá thể Sinh viên.Nếu bạn muốn đảm bảo rằng một trường hợp sinh viên được tạo ra cho mỗi tài trong hệ thống, bạn có thể sử dụng các tín hiệu sau:
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()
nếu mô hình sinh kế thừa mô hình tài khoản bạn sẽ chỉ cần một ModelForm. –
@KevinL., Nó sẽ là tuyệt vời nếu bạn xây dựng điều này trong một câu trả lời :-) – cel
@cel AFAIK, đã có không có sự phát triển như thế này để nói về trong lõi Django. Một giải pháp 'tự động' ở đây có thể sẽ không nhỏ và liên quan đến việc viết các lớp mô hình tùy chỉnh của riêng bạn hoặc các mixin để làm như vậy. Điều này sẽ phức tạp hơn nhiều (và cho là dễ vỡ hơn) so với sử dụng các phương pháp được đề xuất. Một giải pháp có thể có trong [câu trả lời] này (https://stackoverflow.com/a/41559015/5747944) mô tả một mixin ModelForm cho phép xác định mô hình 'con' thứ hai và được tuyên bố là tương thích với các khung nhìn chung. – sytech