在django-admin中,我尝试在两个自定义模型 Practitionner 和 Patient 中添加来自用户 django类的细节字段。
在视觉上,在django管理界面上,当我点击Patient时,我需要有User + Patient字段,而Practitionner则相同。而不是创建两个用户+一个患者+一个实践者并手动建立关系。
以下是两个型号代码:
class Practitioner(models.Model):
user = models.OneToOneField(User)
phone = models.CharField(max_length=15, verbose_name="Numéro de téléphone professionel")
office = models.ForeignKey(locals.Office)
exams = models.ManyToManyField(exams.Exam)
def __str__(self):
return self.user.first_name + " " + self.user.last_name
class Patient(models.Model):
user = models.OneToOneField(User)
phone = models.CharField(max_length=15, verbose_name="Numéro de téléphone fixe")
mobile_phone = models.CharField(max_length=15, verbose_name="Numéro de téléphone portable")
birth_date = models.DateField(verbose_name="Date de naissance")
city = models.CharField(max_length=100, verbose_name="Ville")
country = models.CharField(max_length=50, verbose_name="Pays")
streetNumber = models.PositiveSmallIntegerField(verbose_name="N°")
streetName = models.CharField(max_length=100, verbose_name="Nom")
postalCode = models.CharField(max_length=10, verbose_name="Code postal")
def __str__(self):
return self.user.first_name + " " + self.user.last_name
下面的代码代表了这个想法,我使用了内联系统,但它无效,因为用户没有对Practitionner的外键:
class UserInline(admin.StackedInline):
model = User
class PractitionerAdmin(admin.ModelAdmin):
inlines = [UserInline]
admin.site.register(Practitioner, PractitionerAdmin)
提前致谢。
答案 0 :(得分:0)
您可以通过将内联带入用户管理员来执行此操作:
class PractitionerInline(admin.TabularInline):
model = Practitioner
class UserAdmin(admin.ModelAdmin):
inlines=[PractitionerInline]
admin.site.unregister(User)
admin.site.register(User, UserAdmin)
请注意取消注册用户,因为之前已由auth注册。
如果您想对患者做同样的事情,您需要“复制”用户模型并注册:
class PatientUser(User):
class Meta:
proxy = True
class PatientInline(admin.TabularInline):
model = Patient
class PatientUserAdmin(admin.ModelAdmin):
inlines=[PatientInline]
admin.site.register(PatientUser, PatientUserAdmin)
请注意,您还应该为两个Admin类定义queryset方法,并相应地过滤作为患者或从业者的用户。
编辑 - 这是后者的方法:
class PatientUserAdmin(admin.ModelAdmin):
inlines=[PatientInline]
def get_queryset(self, request):
qs = super(PatientUserAdmin, self).get_queryset(request)
qs = qs.exclude(patient__isnull=True)
return qs