在Django模板中有条件地显示不同模型字段值的“最佳”方法?

时间:2010-08-11 06:06:12

标签: django django-models django-templates

我正在建立一个网站,提供两种语言的产品信息:英文和中文。

每件商品必须有英文名称,并且可能还有中文名称。

每次请求产品页面时,都会检查request对象以确定产品名称是否应以英文或中文显示。在后一种情况下,如果设置则显示中文名称,否则将显示英文名称。

以下是我的Product模型的简化版本,删除了无关信息:

class Product(models.Model):
    english_name = models.CharField(max_length=100)
    chinese_name = models.CharField(max_length=100, null=True, blank=True)

    def name(self, language):
        if language == 'Chinese' and self.chinese_name:
            return self.chinese_name
        else:
            return self.english_name

我的问题是从模板中输出所需名称的最简洁方法是什么?无法调用name方法,因为它必须传递language参数,而Django模板只能接受没有参数的方法调用。

可以使用模板中的逻辑来做所有事情,但这远非优雅:

{% ifequal language 'Chinese' %}
    {% firstof product.chinese_name product.english_name %}
{% else %}
    {{ product.english_name }}
{% endifequal %}

我也可以写一个模板过滤器来包含上面的逻辑:

@register.filter
def name(product, language):
    if language == 'Chinese' and product.chinese_name:
        return product.chinese_name
    else:
        return product.english_name

使用起来相当不错:

{{ product|name:language }}

创建模板过滤器可以完成工作,但对我来说,这个逻辑真的属于模型。模板过滤器是否很好,或者是否有“更好”的方法来实现相同的结果?

我意识到我的问题相当模糊 - 我有几个有效的解决方案,但我想知道这个问题的“最佳”解决方案(如“最佳实践”)。

1 个答案:

答案 0 :(得分:4)

如何对过滤器进行少量更改?

@register.filter
def name(product, language):
    return product.name(language)

这样你的过滤器只包装了这个电话;逻辑仍在模型内部处理。只是一个想法。