我正在尝试编写一个模块,允许我指定哪些字段应该直接在模型中显示在FieldList
中,以便能够为所有模型使用通用模板。
因此,在通用列表的模板中,我不知道必须显示哪些字段。使用templatetags(我知道,它有点难看),我终于能够显示带有相应值的列表,但我必须使用函数value_to_string
,如下所述:
@register.simple_tag
def get_value_field(instance, field):
"""
Returns the value of a field for an instance.
"""
return field.value_to_string(instance)
在模板中:
{% with object_list|get_list_fields as field_list %}
[...]
{% for field in field_list %}
<td> {% get_value_field object field %} </td>
{% endfor %}
一切正常,但我不明白为什么value_to_string
(使用isoformat()
,请参见http://fossies.org/dox/Django-1.6.5/django_2db_2models_2fields_2____init_____8py_source.html#l00806),默认模板格式的行为与{{ object.date_begin }}
不同显示“11août2014”(我是法国人)虽然{% get_value_field object field %}
给了我isoformat()
“2014-08-11”。
我做错了什么?
我可以使用以下代码来获取python日期,然后对其进行格式化,但我确信有更好的方法可以做到这一点。
@register.simple_tag
def get_value_field(instance, field):
"""
Returns the value of a field for an instance.
"""
# Cas particuliers pour l'affichage
if isinstance(field, django.db.models.fields.DateField):
return field._get_val_from_obj(instance).[...] # Format date to the same format here
return field.value_to_string(instance)
答案 0 :(得分:0)
行为不同,因为您的自定义标记返回原始字符串,而{{ object.date_begin }}
返回date
对象,然后模板引擎变为字符串。启用本地化后,默认情况下,日期格式已本地化。
我认为您可以通过从_get_val_from_obj
导入并调用django.utils.formats.localize
字段的值来在模板标记中获得相同的行为,可能需要进行一些后处理以捕获任何非字符串查找的值localize
不像模型实例那样处理。 localize
如果值不是它可以处理的值,则返回值不变,因此您可以检查来自localize
的非字符串返回值,而不是检查来自date
的{{1}}结果{1}} - 我认为认为它更清洁。