Django Admin 实现动态多选标签表单的完整示例

追风的人
追风的人
发布时间:2026-10-12 | 2人浏览过
原创

本文介绍如何在 Django Admin 中实现动态更新的多选标签表单。通过自定义 ModelForm 和 Admin 配置,利用 values_list 获取最新标签列表,并在表单初始化时动态绑定选项。同时处理数据库中以字符串列表形式存储的标签数据,确保新增和编辑功能正常运作。

背景介绍

利用 django-admin 框架,开发者可以迅速构建基础的增删改查(CRUD)管理界面。然而,当业务需求涉及创建包含多选标签字段的表单时,默认的 admin 配置往往无法满足要求,需要对表单逻辑进行定制化调整。

代码示例

模型定义文件(model.py)

  • 本示例包含两个模型类:一个是用于定义标签的 tag 类,另一个是用于定义书籍信息的 book 类。
  • book 模型中包含了 tag 字段,这里为了避免外键关联可能带来的性能问题,选择不使用外键约束,而是采用其他存储方式。
class tag(models.Model):
    name = models.CharField(max_length=20, verbose_name='标签')
 
 
class book(models.Model):
    name = models.CharField(max_length=50, verbose_name='书名')
    tags = models.TextField(null=True, verbose_name='标签')

后台管理配置(admin.py)

必须将对应的 Model 注册到 admin 中,Django Admin 才能识别并使用这些模型。主要的配置工作集中在 admin.py 文件中,以下是几个关键注意点:

  • 使用 values_list 方法返回的数据格式示例为:<QuerySet [('tag1', 'tag1'), ('tag2', 'tag2')]>。
  • 为了确保标签列表始终是最新的,需要在表单初始化的阶段执行一次标签查询操作。
  • 在表单初始化过程中,需要将查询得到的列表对象赋值给表单字段,以便在界面上正确显示标签选项。
# 标签查询
def get_tag_list():
    return tag.objects.values_list("name", "name")
 
# 表单类定义
class bookForm(forms.ModelForm):
    tags = forms.MultipleChoiceField(label='标签', widget=widgets.CheckboxSelectMultiple)
 
    def __init__(self, *args, **kwargs):
        super(cameraForm, self).__init__(*args, **kwargs)
        
        # 保证每次初始化有最新的标签列表
        self.fields['tags'].choices = get_tag_list()
        
        # 由于会在数据库中存储为列表字符串,需在赋值时转回列表对象,才能在修改表单时识别原值
        self.initial['tags'] = eval(self.initial['tags'])    
 
    class Meta:
        model = book
        exclude = []
 
# book扩展
class bookAdmin(admin.ModelAdmin):
    search_fields = 'name', 'tags')
    list_display = ( 'name', 'tags')
    form = bookForm
 
# 注册到admin中
admin.site.register(book, bookAdmin)

最终处理结果

数据写入数据库时的格式要求。

在数据库中,标签信息以字符串列表的形式进行存储。

Django 表单的样式表现。

以上即为 Django Admin 实现动态多选框表单的示例代码详解,更多关于 Django Admin 多选框表单的资料,请持续关注本站发布的其他相关文章。

相关标签:

本站声明

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

Python 相关产品和应用

全部下载

专题列表