【问题标题】:Add fields from User to a customModel, in django admin在 django admin 中将字段从 User 添加到 customModel
【发布时间】:2016-10-27 16:13:36
【问题描述】:

在 django-admin 中,我尝试将 User django 类的具体字段添加到两个自定义模型 PractitionnerPatient 中。 p>

在视觉上,在 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

下面的代码代表了这个想法,我使用了 inline 系统但它是无效的,因为用户没有 Practitionner 的外键:

class UserInline(admin.StackedInline):
    model = User

class PractitionerAdmin(admin.ModelAdmin):
    inlines = [UserInline]

admin.site.register(Practitioner, PractitionerAdmin)

提前致谢。

【问题讨论】:

  • 您能否详细说明“反向操作”的问题?很高兴看到 PatientPractitioner 的模型定义。你说这是“因为我有另一个模型 Patient,它也使用 User 模型,它们需要在两个不同的地方。” 1.听起来可能应该有一个从PatientPractitioner的外键。 2. 这是否可以通过使用related_name 属性来解决,这样反向访问器就不会发生冲突?
  • 为什么要在 OneToOne 字段上使用内联?这对我来说没有意义!如果您想将 User 模型的字段添加到您的 Practioner 模型中,为什么不让它继承自 User: class Practionser(User): - 那么这些字段将显示在管理员中。
  • @ger.s.brett 我遵循了文档:docs.djangoproject.com/en/1.10/topics/auth/customizing/…,所以我偷了同样的想法。我尝试从 User 类继承 Practionner,但是这样它就不会继续使用数据库中的 User 表了。
  • @nimasmi 是的,抱歉,我已经用您提出的信息更新了问题帖子。

标签: python django django-models django-admin


【解决方案1】:

您可以通过将内联引入用户管理员来做到这一点:

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 

【讨论】:

  • 好的,谢谢您,我使用了您的第二个代码作为 Patient and Practitionner。很好,但是正如您所说,问题是两个模型中都列出了相同的用户。我已经看到我可以使用 list_filter = ( ('user', admin.RelatedOnlyFieldListFilter),),但它不起作用,因为我只能访问从 ModelAdmin 继承的类中的用户字段。如何补救。 ?
  • 啊,太好了,我现在看得更清楚了,我完全忘记了反向关系。再次感谢您,问题已解决
猜你喜欢
  • 2018-03-05
  • 2021-12-25
  • 1970-01-01
  • 2013-10-11
  • 2011-05-26
  • 1970-01-01
  • 2015-05-16
  • 2015-01-24
  • 2023-01-13
相关资源
最近更新 更多