Django - 如何使用带有多个参数的templatetags过滤器

时间:2009-05-22 02:37:18

标签: python django filter django-templates tags

我有一些值,我想传递给过滤器,并从中获取一个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  

输出网址应如下所示:

http://foo.org/john-smith-ARGScustidZZ11QQsortidZZ2

当ARGS是参数的开头时,ZZ是'='而QQ是'&amp;'等效。

首先:这会有效,但我得到了add_args()中的custid = name.id,我希望custid = 11进来。如何将id作为id传入而不是文本

另外,有没有办法像PHP一样发送key =&gt;值的数组。 在PHP中我会构建一个数组,比方说:

arglist = array('custid' => $nameid, 'sortid' => $sortid ); 

然后我会将arglist作为参数传递给add_args()并在add_args()我会做

foreach( arglist as $key => $value)
  $argstr .= $key . 'ZZ' . $value . 'QQ'.

有没有人有更好的方法让这项工作?

注意:如果我必须将所有参数作为字符串传递并在过滤器中将它们拆分,我不介意。我只是不知道如何传递name.id作为它的价值......

3 个答案:

答案 0 :(得分:6)

这种“聪明”的东西逻辑不应该在模板中。 在您的视图中构建您的URL结尾,然后将它们传递给模板:

def the_view(request):
  url_stuff = "custid=%s, sortid, ...." % (name.id, 2 ...)

  return render_to_response('template.html',
    {'url_stuff':url_stuff,},
    context_instance = RequestContext(request))

在template.html中:

 ....

    <a href='{{url_stuff}}'>{{name}}</a>

 ....

如果您需要一大堆对象的网址,请考虑在模型上使用get_absolute_url

答案 1 :(得分:4)

您无法将name.id传递给过滤器。过滤器参数可以是单个值或单个文字。 Python / Django不会像PHP那样尝试任何“智能”变量替换。

我建议你为这个任务创建一个标签:

<a href='{% add_args "custid" name.id "sortid" "2" %}{{name|slugify}}{% end_add_args %}'>{{name}}</a>

通过这种方式,您可以知道哪个参数是文字值,哪个参数应该从上下文等处获取...文档非常清楚,请查看example

此外,如果此name与模型有任何关联,请说我们想要进入固定链接,添加一个返回带有正确参数的URL的方法可能是最整洁的解决方案。

总的来说,我会避免在模板中加入过多的逻辑。 Django不是PHP。

答案 2 :(得分:3)

你正在调用argz.join几次并且从不将结果分配给任何东西:也许你是在错误的观念下操作,即字符串的join方法有一些神秘的副作用,但它不会 - 它只返回一个新字符串,如果你没有对那个新字符串 poof 做任何事情,它就会消失。这至少是你问题的一部分......?