在 Django 中,有很多模型可以分别地管理,但是有时候我们希望使用一个表单就可以管理所有模型。例如,在一个招聘网站中,我们需要管理求职者的基本信息、地址、职业期望、教育经历、工作经历等信息。如果按照常规的方式,我们需要在管理界面中创建六个独立的表单,这可能会导致界面混乱,并且当我们想要修改求职者的信息时,需要在六个表单之间切换,非常不方便。
- 解决方案
为了解决这个问题,我们可以使用 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,它包含了求职者的基本信息。然后,我们创建了其他模型 Address、Pretensoes、Graduation、Professional 和 Info,它们分别包含了求职者的地址、职业期望、教育经历、工作经历和其他信息。
在 admin.py 文件中,我们创建了一个新的 CandidateAdmin 类,它继承了 ModelAdmin 类。然后,我们在 inlines 属性中指定了我们要嵌入到 Candidate 表单中的其他模型的表单。
这样,当我们在管理界面中打开一个 Candidate 对象时,我们就可以看到一个包含了所有相关信息的表单。我们可以直接在表单中修改这些信息,而不需要切换到其他页面。
希望这个示例能够帮助你解决你的问题。