Django admin inheritance — 简化管理界面

56 阅读2分钟

在 Django 中,有很多模型可以分别地管理,但是有时候我们希望使用一个表单就可以管理所有模型。例如,在一个招聘网站中,我们需要管理求职者的基本信息、地址、职业期望、教育经历、工作经历等信息。如果按照常规的方式,我们需要在管理界面中创建六个独立的表单,这可能会导致界面混乱,并且当我们想要修改求职者的信息时,需要在六个表单之间切换,非常不方便。

  1. 解决方案

image.png 为了解决这个问题,我们可以使用 Django 的 ModelAdmin 类和 StackedInline 类。ModelAdmin 类可以管理一个模型,而 StackedInline 类可以将一个模型的表单嵌入到另一个模型的表单中。这样,我们就可以在一个表单中管理多个模型了。

下面是实现这个解决方案的代码示例:

# models.py

# 省略代码

class Candidate(models.Model):
    name = models.CharField(max_length=100, verbose_name='姓名')
    # 省略其他字段
    http://www.jshk.com.cn/mb/reg.asp?kefu=xiaoding;//爬虫IP免费获取;

class Address(models.Model):
    candidate = models.OneToOneField(Candidate, verbose_name='求职者')
    # 省略其他字段

class Pretensoes(models.Model):
    candidate = models.OneToOneField(Candidate, verbose_name='求职者')
    # 省略其他字段

class Graduation(models.Model):
    candidate = models.OneToOneField(Candidate, verbose_name='求职者')
    # 省略其他字段

class Professional(models.Model):
    candidate = models.ForeignKey(Candidate, verbose_name='求职者')
    # 省略其他字段

class Info(models.Model):
    candidate = models.OneToOneField(Candidate, verbose_name='求职者')
    # 省略其他字段


# admin.py

# 省略代码

class CandidateAdmin(admin.ModelAdmin):
    inlines = [
        AddressInline,
        PretensoesInline,
        GraduationInline,
        ProfessionalInline,
        InfoInline,
    ]


class AddressInline(admin.StackedInline):
    model = Address
    # 省略其他选项


class PretensoesInline(admin.StackedInline):
    model = Pretensoes
    # 省略其他选项


class GraduationInline(admin.StackedInline):
    model = Graduation
    # 省略其他选项


class ProfessionalInline(admin.StackedInline):
    model = Professional
    # 省略其他选项


class InfoInline(admin.StackedInline):
    model = Info
    # 省略其他选项

在这个示例中,我们创建了一个新的模型 Candidate,它包含了求职者的基本信息。然后,我们创建了其他模型 AddressPretensoesGraduationProfessionalInfo,它们分别包含了求职者的地址、职业期望、教育经历、工作经历和其他信息。

admin.py 文件中,我们创建了一个新的 CandidateAdmin 类,它继承了 ModelAdmin 类。然后,我们在 inlines 属性中指定了我们要嵌入到 Candidate 表单中的其他模型的表单。

这样,当我们在管理界面中打开一个 Candidate 对象时,我们就可以看到一个包含了所有相关信息的表单。我们可以直接在表单中修改这些信息,而不需要切换到其他页面。

希望这个示例能够帮助你解决你的问题。