我正在建立一个网站,提供两种语言的产品信息:英文和中文。
每件商品必须有英文名称,并且可能还有中文名称。
每次请求产品页面时,都会检查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 }}
创建模板过滤器可以完成工作,但对我来说,这个逻辑真的属于模型。模板过滤器是否很好,或者是否有“更好”的方法来实现相同的结果?
我意识到我的问题相当模糊 - 我有几个有效的解决方案,但我想知道这个问题的“最佳”解决方案(如“最佳实践”)。
答案 0 :(得分:4)
如何对过滤器进行少量更改?
@register.filter
def name(product, language):
return product.name(language)
这样你的过滤器只包装了这个电话;逻辑仍在模型内部处理。只是一个想法。