如何使用Django中的value_to_string重现本机模板日期格式

时间:2014-08-03 20:17:16

标签: python django django-templates

我正在尝试编写一个模块,允许我指定哪些字段应该直接在模型中显示在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)

1 个答案:

答案 0 :(得分:0)

行为不同,因为您的自定义标记返回原始字符串,而{{ object.date_begin }}返回date对象,然后模板引擎变为字符串。启用本地化后,默认情况下,日期格式已本地化。

我认为您可以通过从_get_val_from_obj导入并调用django.utils.formats.localize字段的值来在模板标记中获得相同的行为,可能需要进行一些后处理以捕获任何非字符串查找的值localize不像模型实例那样处理。 localize如果值不是它可以处理的值,则返回值不变,因此您可以检查来自localize的非字符串返回值,而不是检查来自date的{​​{1}}结果{1}} - 我认为认为它更清洁。