在Django admin中编辑ManyToManyField的实现方法
本文介绍如何在Django Admin中优化ManyToManyField的编辑体验。默认Admin界面对该字段支持较弱,通过自定义ModelAdmin并使用filter_horizontal属性,可生成更友好的左右选择界面,提升多对多关系的维护效率。
Django中定义多对多关系
如何定义多对多关系
Django 内置了功能强大的 ORM 框架,支持自定义 Model 并将其映射到数据库表中。
在 Model 中可以定义多种数据类型,例如整型、字符型,也可以通过定义外键 ForeignKey 来指定一对多关系。
关系数据库中存在多对多关系,Django 的 ORM 同样支持这一概念,通过 ManyToManyField 即可实现。
下面以 EmailGroup 和 Email 为例,展示具体的使用方式。
class EmailTo(models.Model):
name = models.CharField(max_length=64)
email = models.EmailField(max_length=255, unique=True, db_index=True)
def __unicode__(self):
return self.name
class EmailGourp(models.Model):
name = models.CharField(max_length=64)
email_to = models.ManyToManyField(EmialTo, blank=True)
def __unicode__(self):
return self.name
此处定义了 EmailGroup 和 EmailTo 之间为多对多关系。执行 migrate 时,数据库会自动生成一个用于映射关系的中间表,表名通常为 emailgroup_email_to。
定制Admin编辑ManyToManyField
如何编辑多对多关系
Django 的另一大亮点是能够根据 Model 自动生成 Admin 站点,并支持对 Admin 站点进行定制。然而,默认的 Admin 站点对 ManyToManyField 的编辑功能较为薄弱,且存在一定局限性。
如果仅使用默认配置,
admin.site.register(EmialGourp)
那么如何才能让 Admin 站点更好地支持 ManyToManyField 的编辑呢?这需要我们对 Admin 站点进行定制化开发。
首先,我们需要定义 EmailGroup 的 Admin 配置。
class EmailGroupAdmin(ModelAdmin):
list_display = ('name',)
fieldsets = (
(None, {'fields': ('name', 'email_to')}),
)
filter_horizontal = ('email_to',)
这里的重点在于使用 filter_horizontal 属性。
接着,将 EmailGroupAdmin 注册到 admin.site 中。
admin.site.register(EmialGourp, EmailGroupAdmin)
这样,Admin 界面就会呈现出一个非常友好的界面来编辑 ManyToManyField。
以上这篇在Django admin中编辑ManyToManyField的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













