我有几个值要传递到一个过滤器中,并从中获取一个URL。
在我的模板中,我有:
{% if names %}
{% for name in names %}
<a href='{{name|slugify|add_args:"custid=name.id, sortid=2"}}'>{{name}}</a>
{%if not forloop.last %} | {% endif %}
{% endfor %}
{% endif %}
在我的模板标签里有:
@register.filter
def add_args(value, args):
argz = value.strip() + '-' + 'ARGS'
arglist = args.split(',')
for arg in arglist:
keyval = arg.split('=')
argz.join(keyval[0] + 'ZZ' + keyval[1])
argz.join('QQ')
return argz
输出URL应如下所示:
http://foo.org/john-smith-ARGScustidZZ11QQsortidZZ2
其中ARGS是参数的开始,ZZ是“=”,QQ是等效的“&;”。
首先:这是可行的,但是我得到了add_args()中的custid=name.id,在这里我想让custid=11进来。如何将id作为id而不是文本传入。
另外,有没有一种方法可以像在PHP中一样发送key=>;值数组。 在PHP中,我将构建一个数组,例如:
arglist = array('custid' => $nameid, 'sortid' => $sortid );
然后我将arglist作为参数传递给add_args()
,并在add_args()
中执行
foreach( arglist as $key => $value)
$argstr .= $key . 'ZZ' . $value . 'QQ'.
有没有人有更好的方法让这个工作?
注意:如果必须将所有参数作为字符串传递,并在筛选器中将它们拆分,我不介意。我只是不知道如何传递name.id作为其值。。。
你调用了
argz.join
几次,却从未将结果分配给任何东西:也许你是在错误地认为一个字符串的join
方法有一些神秘的副作用,但它并不——它只是返回一个新字符串,如果你对这个新字符串不做任何操作,poof,它就消失了。这是你问题的一部分吗。。。?不能将
name.id
传递到筛选器。筛选器参数可以是单个值或单个文本。Python/Django不会尝试像PHP这样的“智能”变量替换。我建议您为此任务创建标记:
这样你就可以知道哪一个参数是一个字面值,哪一个应该从上下文中获取。。。文档对此非常清楚,请查看example。
另外,如果这个
name
与模型有任何关系,比如说我们想访问permalink,那么添加一个返回带有适当参数的URL的方法可能是最整洁的解决方案。总的来说,我不会在模板中加入太多的逻辑。Django不是PHP。
这个“聪明”的东西逻辑不应该在模板中。 在视图中生成URL结尾,然后将它们传递给模板:
在template.html中:
如果您需要一个用于一大堆对象的url,请考虑在模型上使用get_absolute_url。
相关问题 更多 >
编程相关推荐