2

我有一些值想传递给过滤器并从中获取 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=>value 数组。在 PHP 中,我会构建一个数组,比如说:

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

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

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

有没有人有更好的方法来完成这项工作?

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

4

3 回答 3

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 。

于 2009-05-26T17:08:24.873 回答
4

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

我建议您为此任务创建一个标签:

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

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

此外,如果这name与模型相关,比如我们想要访问永久链接,添加一个返回带有正确参数的 URL 的方法可能是最简洁的解决方案。

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

于 2009-05-22T07:47:51.870 回答
3

您调用argz.join了几次并且从未将结果分配给任何东西:也许您误以为join字符串的方法具有一些神秘的副作用,但事实并非如此-它只是返回一个新字符串,并且如果你不对那个新字符串poof做任何事情,它就消失了。这至少是你问题的一部分吗......?

于 2009-05-22T04:08:59.220 回答