我正在建立一个网站,它将提供两种语言的产品信息:英文和中文。
每个产品必须有一个英文名称,也可以有一个中文名称。
每次请求产品页面时,都会检查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 }}创建一个模板过滤器可以完成任务,但对我来说,这个逻辑确实属于模型。模板过滤器是一个很好的方法,还是有一种“更好”的方法来达到同样的效果?
我意识到我的问题相当模糊--我有几个可行的解决方案,但我想知道什么是这个问题的“最佳”解决方案(如“最佳实践”)。
发布于 2010-08-11 06:31:12
对过滤器做个小改动如何?
@register.filter
def name(product, language):
return product.name(language)这样,您的过滤器只是包装调用;逻辑仍然在模型中处理。这只是个想法。
https://stackoverflow.com/questions/3455688
复制相似问题