首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Django模板中有条件地显示不同模型字段值的“最佳”方法?

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

Stack Overflow用户
提问于 2010-08-11 06:06:12
回答 1查看 236关注 0票数 4

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

每个产品必须有一个英文名称,也可以有一个中文名称。

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

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

代码语言:javascript
复制
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模板只能容纳没有参数的方法调用。

我可以使用模板中的逻辑来完成所有事情,但这还远远不够优雅:

代码语言:javascript
复制
{% ifequal language 'Chinese' %}
    {% firstof product.chinese_name product.english_name %}
{% else %}
    {{ product.english_name }}
{% endifequal %}

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

代码语言:javascript
复制
@register.filter
def name(product, language):
    if language == 'Chinese' and product.chinese_name:
        return product.chinese_name
    else:
        return product.english_name

这将是相当不错的使用:

代码语言:javascript
复制
{{ product|name:language }}

创建一个模板过滤器可以完成任务,但对我来说,这个逻辑确实属于模型。模板过滤器是一个很好的方法,还是有一种“更好”的方法来达到同样的效果?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-11 06:31:12

对过滤器做个小改动如何?

代码语言:javascript
复制
@register.filter
def name(product, language):
    return product.name(language)

这样,您的过滤器只是包装调用;逻辑仍然在模型中处理。这只是个想法。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3455688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档