Jeśli nie chcesz zmieniać AUTH_USER_MODEL, który ma wiele skutków ubocznych, można użyć Multi-table inheritance i podklasy modelu użytkownika zamiast AbstractUser. Spowoduje to utworzenie Student stolik z OneToOneField nazwie user_ptr, który wskazuje na użytkownika tabeli.
Oto przykład
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')
Teraz można zdefiniować ModelForm jak ten
class StudentForm(forms.ModelForm):
class Meta:
model = Student
fields = ('first_name', 'last_name', 'username',
'personalInfo', 'phone', 'birthdate', 'city')
Możesz również rozszerzyć wbudowaną w Django formularzy użytkownika, takie jak ten
from django.contrib.auth.forms import UserChangeForm
class StudentForm(UserChangeForm):
class Meta:
model = Student
fields = ('first_name', 'last_name', 'username',
'personalInfo', 'phone', 'birthdate', 'city')
Aby użyć formularza w administratorze django, dodaj t on następujące do 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)
subkomitet uznającej użytkownika modelu, tworząc Student instancję automatycznie utworzy nową instancję użytkownika, ale nie na odwrót. Tak więc instancja może istnieć bez powiązania z instancją Student.Jeśli chcesz mieć pewność, że instancja Student jest tworzony dla każdego Użytkownika w systemie, można użyć następujący sygnał:
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()
jeśli modelu Student dziedziczone modelu użytkownika, który musiałby tylko jeden ModelForm. –
@KevinL., Byłoby wspaniale, gdyby rozwinąć to w odpowiedzi :-) – cel
@cel AFAIK, nie było takich wydarzeń, o których mowa w rdzeniu Django. "Automatyczne" rozwiązanie byłoby prawdopodobnie nietrywialne i wymagałoby napisania własnych niestandardowych klas modelu lub miksów, aby to zrobić. Byłoby to znacznie bardziej złożone (i prawdopodobnie bardziej kruche) niż przy użyciu sugerowanych metod. Jedno z możliwych rozwiązań może znaleźć się w [tej odpowiedzi] (https://stackoverflow.com/a/41559015/5747944), która opisuje mixin modelForm, który pozwala na zdefiniowanie drugiego modelu "dziecka" i jest uznawany za zgodny z widokami ogólnymi. – sytech