用 Django 做表单时候,多选项会按 列表 格式,以字符串的形式记录在数据库:

2019-08-11_16-21

由于需要用已记录的字段去判断是否给 input 添加 checked 属性,但直接迭代这个项会发现它是以字符串的形式被迭代的,也就是以字符为单位进行迭代,这可不是我们想要的效果。

我想要的是,让这个字段的值是以一个 list() 的形式来使用的。这时候,就需要自定义 django 模板过滤器来实现需求。

创建自定义标签文件

在应用的根目录创建 templatetags 目录,在里面创建自定义标签文件,文件名是未来 {% load file_name %} 使用的,所以可以把自定义标签进行归类,如果没那么多自定义标签,完全可以这样命名 myapp_tags.pymyapp 是应用的名称。使用时候,在模板中 {% load myapp_tags %} 这样加载。

自定义标签

from django import template

register = template.Library()

# 字符串转列表
@register.filter
def str_to_list(value):
    if '[' and ']' in value:
        return eval(value)

使用自定义标签/过滤器

{% load myapp_tags %}
{% for i in items|str_to_list %}
    {{ i }}
{% endfor %}

Reference