当我使用with
和add
组合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)
答案 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])