Django Admin 实现动态多选标签表单的完整示例
本文介绍如何在 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 多选框表单的资料,请持续关注本站发布的其他相关文章。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









