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

如何定义多对多关系

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的时候就会在数据库中多产生一个作Mapping的表,表名一般为emailgroup_email_to

如何编辑多对多关系

Django另一个强大的功能是可以根据model来生成admin site,并且可以对admin site进行定制。但是默认的admin site 对这种ManytoManyField的编辑功能非常的弱小而且还有问题。

就是如果只有这样的话

admin.site.register(EmialGourp)

那如何才能使admin site很好的支持编辑ManytoManyField呢,这样就需要定制化admin site

首先定义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的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 解决Django后台ManyToManyField显示成Object的问题

    如果一个模型里包含了ManyToManyField,在admin后台可能会显示成object,例如 解决方法: 在定义这个类的时候,加多一个函数 实际效果: 以上这篇解决Django后台ManyToManyField显示成Object的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • Django 多表关联 存储 使用方法详解 ManyToManyField save

    当models中使用ManyToManyField进行多表关联的时候,需要使用字段的add()方法来增加关联关系的一条记录,让两个实例关联起来才能顺利保存关联关系 #models.py 问题分类question_category和类别使用了多对多关系(先不管是否合理) #coding:utf-8 from django.db import models # Create your models here. class QuestionCategory(models.Model): categor

  • Django ManyToManyField 跨越中间表查询的方法

    1.在 django 表中用到了 manytomany 生成了中间表 pyclub_article_column from django.db import models # Create your models here. class Column(models.Model): id = models.AutoField(u'序号',primary_key=True,auto_created=True) name = models.CharField(u'名字',max_length=100)

  • django ManyToManyField多对多关系的实例详解

    Django 的 ORM 有多种关系:一对一,多对一,多对多 各自定义的方式为 : 一对一: OneToOneField 多对一: ForeignKey 多对多: ManyToManyField 上边的描述太过数据而缺乏人性化,我们来更人性化一些: 多个属于一个,即 belong to : ForeignKey,多个属于一个 一个有一个,即 has one: OneToOneField 一个有很多个,即 has many: lots of A belong to B 与 B has many A

  • Django ORM多对多查询方法(自定义第三张表&ManyToManyField)

    对于多对多表 - 1.自定义第三张表,更加灵活 - 2.ManyToManyField 自动生成第3张表 只能 有3列数据 不能自己添加. 自定义第三张表 # models.py class Boy(models.Model): name = models.CharField(max_length=32) class Girl(models.Model): name = models.CharField(max_length=32) class Love(models.Model): b = m

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

    如何定义多对多关系 Django 本身自带了一个很强大的ORM,支持自定义model并将其映射到数据库的表中 model中可以定义各种类型的数据,比较直观的比如整形, 字符型,也可以定义外键 ForeignKey来指定一对多关系. 关系数据库中有一种多对多的关系,在Django的ORM中也支持它,使用ManyToManyField. 下面使用EmailGroup和Email来展示如何使用 class EmailTo(models.Model): name = models.CharField(m

  • Django admin禁用编辑链接和添加删除操作详解

    禁用admin中models的编辑链接和添加删除按钮 方法如下: class MyModelAdmin(models.ModelAdmin): ... List_display_links = None #禁用编辑链接 def has_add_permission(self, request): # 禁用添加按钮 return False def has_delete_permission(self, request, obj=None): # 禁用删除按钮 return False def g

  • 在django admin中添加自定义视图的例子

    django admin提供了完善的用户管理和数据模型管理,方便实用.研究了一下在admin里面添加自己的页面. 在admin.py里继承django.contrib.admin.ModelAdmin基类 class FaceAdmin(admin.ModelAdmin): 然后在里面写自己的视图处理函数.基类里面的save_model和delete_model函数可以做数据对象的新建和删除的预处理和后处理.自建的函数如果要redirect到自己建的view,反向映射要包含admin:,写成 r

  • Django Admin中增加导出CSV功能过程解析

    参考 https://books.agiliq.com/projects/django-admin-cookbook/en/latest/export.html 在使用Django Admin时, 对于列表我们有时需要提供数据导出功能, 如下图: 增加导出CSV功能 在Django Admin中每个模型的Admin类(继承至admin.ModelAdmin), 我们可以通过actions增加支持的动作, 值为当前类存在的方法名, 例如: ....... @admin.register(Issue

  • Django Admin中增加导出Excel功能过程解析

    在使用Django Admin时, 对于列表我们有时需要提供数据导出功能, 如下图: 增加导出Excel功能 在Django Admin中每个模型的Admin类(继承至admin.ModelAdmin), 我们可以通过actions增加支持的动作, 值为当前类存在的方法名, 例如: ....... @admin.register(Issue) class IssueAdmin(admin.ModelAdmin): ...... actions = ['export_as_excel'] # 增加

  • 在django admin中配置搜索域是一个外键时的处理方法

    python 2.7.11 django 1.8.4 错误内容:related Field has invalid lookup: icontains 我原来默认认为在处理外键搜索的时候,django会自动将该外键的行数据以str()化之后进行搜索,但其实并不是这样的,如果将外键加入到搜索域中,需要明确写出来. 这个是我从网上查到的解决方案,测试可用,如下: models.py 文件 # coding:utf8 from django.db import models class Book(mo

  • Django Admin 实现外键过滤的方法

    说明和 Model 环境: ➜ python Python 3.6.3 |Anaconda custom (x86_64)| (default, Oct 6 2017, 12:04:38) [GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin Type "help", "copyright", "credits" or "license" f

  • django admin 自定义替换change页面模板的方法

    举个简单的例子:(此仅限于修改change_form页面) 原来的时候,change_form_list是包含这些按钮的: 因为此页面继承了 {% extends 'admin/change_form.html' %} 所以,可以将admin/change_form.html 拷贝到指定目录,然后重新指定继承模板. {% extends 'admin/englishwordlibrary/recitequestion/change_form.html' %} 然后我在admin/englishw

  • 详解在Python的Django框架中创建模板库的方法

    不管是写自定义标签还是过滤器,第一件要做的事是创建模板库(Django能够导入的基本结构). 创建一个模板库分两步走: 第一,决定模板库应该放在哪个Django应用下. 如果你通过 manage.py startapp 创建了一个应用,你可以把它放在那里,或者你可以为模板库单独创建一个应用. 我们更推荐使用后者,因为你的filter可能在后来的工程中有用. 无论你采用何种方式,请确保把你的应用添加到 INSTALLED_APPS 中. 我们稍后会解释这一点. 第二,在适当的Django应用包里创

  • 在Python的Django框架中加载模版的方法

    为了减少模板加载调用过程及模板本身的冗余代码,Django 提供了一种使用方便且功能强大的 API ,用于从磁盘中加载模板, 要使用此模板加载API,首先你必须将模板的保存位置告诉框架. 设置的保存文件就是settings.py. 如果你是一步步跟随我们学习过来的,马上打开你的settings.py配置文件,找到TEMPLATE_DIRS这项设置吧. 它的默认设置是一个空元组(tuple),加上一些自动生成的注释. TEMPLATE_DIRS = ( # Put strings here, li

随机推荐