首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Django inlineformset_factory 和 ManyToMany 字段

Django inlineformset_factoryManyToMany 字段

Django 是一个高级的 Python Web 框架,用于快速开发安全、高效、可维护的网站。Django inlineformset_factory 是一个用于创建表单集合的工厂方法,允许您在同一个视图里创建相关表单。这种方法适用于具有复杂关系的多表单向、多表双向关联以及具有嵌套关系的数据模型。

ManyToMany 字段是 Django 中一个用于表示多对多关系的字段。通过使用 ManyToManyField,可以在模型之间建立一种一对多关系。这种关系通常用于实现用户与角色之间的关联、项目与标签之间的关联等场景。

以下是一个关于 Django inlineformset_factory 和 ManyToMany 字段的示例:

代码语言:python
代码运行次数:0
复制
from django.forms import ModelForm, InlineFormSet
from django.contrib.auth.models import User, Group
from django.contrib import admin
from .models import Role, Task, Tag

class RoleForm(ModelForm):
    class Meta:
        model = Role
        fields = ['name', 'label', 'permissions']

class TaskForm(ModelForm):
    class Meta:
        model = Task
        fields = ['name', 'description', 'tag_ids']
        widgets = {
            'tag_ids': ManyToManyField(Tag, widget=AdminTagWidget())
        }

class TagForm(ModelForm):
    class Meta:
        model = Tag
        fields = ['name', 'label']

InlineFormSet = inlineformset_factory(Task, TaskForm)

# 创建角色
class RoleAdmin(admin.ModelAdmin):
    form = RoleForm
    list_display = ['name', 'label', 'permissions']

# 创建任务
class TaskAdmin(admin.ModelAdmin):
    form = TaskForm
    list_display = ['name', 'description', 'tag_ids']

# 创建标签
class TagAdmin(admin.ModelAdmin):
    form = TagForm
    list_display = ['name', 'label']

admin.site.register(Role, RoleAdmin)
admin.site.register(Task, TaskAdmin)
admin.site.register(Tag, TagAdmin)

在这个示例中,我们定义了三个模型:RoleTaskTagRoleTask 模型之间建立了多对多关系,通过 ManyToMany 字段 tag_ids 实现。Tag 模型则与 Task 模型建立了一对多关系。

TaskFormTagForm 中,我们分别定义了 tag_ids 字段,并使用 AdminTagWidget 作为小部件。AdminTagWidget 是一个自定义小部件,用于在 Django 管理界面中显示标签。

最后,我们在 RoleAdminTaskAdminTagAdmin 中分别注册了模型,并定义了所需的小部件。这样,在 Django 管理界面中,您就可以分别为任务和标签提供多对多关系视图了。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Django学习笔记之Queryset详解

Django ORM用到三个类:Manager、QuerySet、Model。Manager定义表级方法(表级方法就是影响一条或多条记录的方法),我们可以以models.Manager为父类,定义自己的manager,增加表级方法;QuerySet:Manager类的一些方法会返回QuerySet实例,QuerySet是一个可遍历结构,包含一个或多个元素,每个元素都是一个Model 实例,它里面的方法也是表级方法,前面说了,Django给我们提供了增加表级方法的途径,那就是自定义manager类,而不是自定义QuerySet类,一般的我们没有自定义QuerySet类的必要;django.db.models模块中的Model类,我们定义表的model时,就是继承它,它的功能很强大,通过自定义model的instance可以获取外键实体等,它的方法都是记录级方法(都是实例方法,貌似无类方法),不要在里面定义类方法,比如计算记录的总数,查看所有记录,这些应该放在自定义的manager类中。以Django1.6为基础。

03
  • Django-models & QuerySet API

    IntegerField  – 整型 BooleanField  – 布尔值类型 NullBooleanField  – 可以为空的布尔值 CharField     – 字符串类型 必须提供max_length参数,字符长度 TextField      – 文本类型 EmailField     – 一个带有检查 Email 合法性的 CharField GenericIPAddressField      IP地址 URLField        URL类型 SlugField  – 字符串类型,只包含字母,数字,下划线或连字符 CommaSeparatedIntegerField   – 字符串类型,格式必须为逗号分割的数字 UUIDField   uuid类型 DateTimeField     – 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] DateField   – 日期格式 YYYY-MM-DD TimeField   – 时间格式 HH:MM[:ss[.uuuuuu]] FloatField(Field)    – 浮点型 DecimalField(Field)   – 10进制小数 BinaryField(Field)    – 二进制类型

    02
    领券