2009-05-22 61 views
2

我有我想进入一个过滤器,并得到一个URL出来的几个值。Django的 - 如何使用templatetags过滤与多个参数

在我的模板,我有:

{% 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 %} 

在我templatetags我:

@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是一个“&”等效。

首先:这会工作,但我得到的custid = name.id进来的add_args(),我想有custid = 11进来。如何通过id作为id和不文本。

此外,有没有办法正好在密钥=>值的阵列状在PHP发送。 在PHP中我将建立一个数组,让说:

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

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

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

任何人是否有更好的办法做这个工作?

注:如果我要传递的所有参数作为一个字符串,在过滤他们分手了,我不介意。我只是不知道如何通过name.id作为它的值...

回答

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> 

.... 

如果您需要一大堆对象的URL考虑使用模型上的get_absolute_url

3

你打电话argz.join几次,永远不会将结果分配给任何东西:也许你正在操作的误解,认为join一个字符串的方法有一些神秘的副作用,但它不会 - 它只是返回一个新的字符串,并且如果你对这个新的字符串没有做任何事情,它就不见了。这至少是你的问题的一部分...?

+0

好抓!我输入了所有内容......错过了作业。对Python也是新的。试图摆脱PHP,但我发现Django的学习曲线非常陡峭。随着API不断变化并被淘汰和淘汰,这是一个动态的目标。 – un33k 2009-05-22 17:58:31

+1

PHP不是Django。你无法比较两者。首先你学习python。然后你学习Django。为什么要将类似PHP的心态带入Django Web框架? – drozzy 2009-05-26 17:02:22

+0

PHP用于解释预期的行为。所以,我知道我想要什么,我知道它是如何在PHP中完成的,现在试图找出我如何将PHP留在后面并转移到PyDj。 – un33k 2009-05-27 17:53:23

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。