在Django admin中编辑ManyToManyField的实现方法

Aria
Aria
发布时间:2026-10-13 | 2人浏览过
原创

本文介绍如何在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的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表