在 django 模板变量中将数字连接为字符串

Posted

技术标签:

【中文标题】在 django 模板变量中将数字连接为字符串【英文标题】:concatenate numbers as strings in django template vars 【发布时间】:2012-03-07 09:08:14 【问题描述】:

我正在尝试连接两个数字以作为参数传递给包含的模板。

特别是,在下面的代码中,我试图为“divnum”传递一些东西

我看了: How can I concatenate forloop.counter to a string in my django template

并认为下面的代码可以工作,但它仍在添加类似的数字! (例如,我在想要“11”的地方得到“2”)

<div id=" forloop.counter graph" style="display:none; padding:  1em, 0;margin: 1em, 0;">
% with x=forloop.counter|stringformat:"s" %
    % include 'graph-div.html' with divnum="1"|stringformat:"s"|add:x  question=response.question title="Nationwide" %
% endwith %
</div>

如何将这些数字连接为字符串?

文档中有一条警告说: 可以强制转换为整数的字符串将被求和,而不是连接,就像上面的第一个示例一样。

所以我可以不做吗?似乎如果有警告,那么他们就知道这是一个问题,并且应该在某个地方有解决方案......

【问题讨论】:

这不是问题,这只是python的工作方式,并且鉴于模板过滤器是从左到右解析的,您正在设置一个数字(1),将其转换为字符串(“1”)并将你的 forloop 计数器添加到它,给你一个整数。如果可能(或在视图中完成),模板中的这种复杂逻辑可能更适合模板标签 我想“问题”是指“程序员想做而他们不能做的事情”。我尽量避免在视图中做这样的小事情,因为它增加了复杂性(我认为)一个不好的原因,但听起来我必须这样做,或者找到另一种解决方法。 听起来是模板标签或过滤器的好理由。它还将使将来的内容更易于阅读和维护。您到底想在代码中做什么以及包含的模板中有什么? 我基本上只是想分配不同的 id——所以我有许多“图形”div,每个里面都有两个“图表”div(包含文件的内容) .我有一个函数可以渲染图形并获取要渲染到的 div 的 id。一位同事指出,由于它们只需要不同,我可以使用“a1”而不是“11”,所以这就是我现在正在做的。 您有实际的Chart 对象吗?如果是这样,您可以简单地将它们的主键用作您的 css 的不同 id,因为它们将始终是不同的:&lt;div id="chart- curr_chart.id "&gt; 【参考方案1】:

遵循 Django 的模型-视图-模板 (MVT) 范式,设置数据层以供用户界面显示的逻辑应该在视图层中。我知道这本身不是业务逻辑,但它似乎在视图中处理得更好。根据经验,我确保我的模板几乎没有任何逻辑,除了基于显示的基本决策。由于您正在“...从数据创建图表对象”,因此您还应该在数据对象在视图中创建/组合时生成您的唯一 ID。模板标签也可以帮助您解决问题,但我仍然建议将其放在视图中。在将数据交给模板之前,请在视图中完成所有数据。

【讨论】:

【参考方案2】:

&lt;appname&gt;\templatetags\&lt;appname&gt;_extras.py 中定义您自己的concatenate 模板过滤器

from django import template

register = template.Library()

@register.filter
def concatenate(arg1, arg2):
    """concatenate arg1 & arg2"""
    return str(arg1) + str(arg2)

【讨论】:

以上是关于在 django 模板变量中将数字连接为字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何在freemarker模板中将字符串转换为数字

shell中将字符串转换成数字

如何在 django 模板中连接字符串?

在 PHP 中将包含数字范围的 GET 变量转换为字符串

过滤器和模板变量

Django之模板