在Django模板中使用with和add组合变量失败

时间:2015-08-31 10:33:46

标签: python django django-templates

当我使用withadd组合Django模板中的变量时遇到了一些问题。

这是我传递给模板的变量

year = 2015
source = u'temp_dir'

在我的模板中,with位于下方,但temp仍为空。

{% with temp="home/"|add:source|add:"/"|add:year %}
{{temp}}
{% withend %}

当我从year移除temp时,temp值变为home/temp_dir/(这是正确的)

{% with temp="home/"|add:source|add:"/"%}
{{temp}}
{% withend %}

我也尝试将year转移到unicode

year = u'2015'
source = u'temp_dir'

但它仍然是空的,year似乎有问题。

更新2015/09/02

以下是我的观点:

## I will get a list of dicts from the db then do..
for result in results:
    result.year = unicode(result.year)

return results

答案

从db查询时,它返回一个QuerySet对象,它不允许我的程序在QuerySet对象的每个dict中插入新的键。但是当我将它们复制到另一个字典列表中时,我可以在其中添加新密钥。

旧代码:

## I will get a list of dicts from the db then do..
for result in results:
    result.year = unicode(result.year)

passed_dict['results'] = results
return  render_to_response(index.html, passed_dict)

新守则:

final_results = []
for result in results:
    temp_result = result
    temp_result.year = unicode(result.year)
    final_results.append(temp_result)

passed_dict['results'] = final_results
return  render_to_response(index.html, passed_dict)

2 个答案:

答案 0 :(得分:1)

您正尝试在上下文中将year作为整数传递。 您需要在上下文中将year的值作为字符串传递。

您需要更改

year = 2015 # passing integer value is wrong here

year = '2015' # pass year in string

您的案例中的add内置模板过滤器需要两个值都是字符串或整数,以便正确执行添加。

  

此过滤器首先尝试将两个值强制转换为整数。如果这   失败,无论如何尝试将值加在一起。这会奏效   对某些数据类型(字符串,列表等)而在其他数据类型上失败。 如果是的话   失败,结果将是一个空字符串。

这里,您将一个值作为字符串传递,将另一个值作为整数传递,这导致显示一个空字符串。

答案 1 :(得分:0)

我认为在模板中做这种工作是个坏主意。但是,如果您出于某种原因必须创建自己的template tag并使用os.path.join

os.path.join将选择按平台分隔(适用于Linux /和适用于Windows \)。

这样的模板标签可能如下所示:

@register.assignment_tag
def build_path(*args):
    # or if you need only / as separator
    # return "/".join([str(arg) for arg in args])
    return os.path.join(*[str(arg) for arg in args])