在django admin

时间:2016-10-27 16:13:37

标签: python django django-models django-admin

在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)

提前致谢。

1 个答案:

答案 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