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

2024-07-05 15:05:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有几个值要传递到一个过滤器中,并从中获取一个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作为其值。。。


Tags: keynameadd模板idurlvalueargs
3条回答

你调用了argz.join几次,却从未将结果分配给任何东西:也许你是在错误地认为一个字符串的join方法有一些神秘的副作用,但它并不——它只是返回一个新字符串,如果你对这个新字符串不做任何操作,poof,它就消失了。这是你问题的一部分吗。。。?

不能将name.id传递到筛选器。筛选器参数可以是单个值或单个文本。Python/Django不会尝试像PHP这样的“智能”变量替换。

我建议您为此任务创建标记:

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

这样你就可以知道哪一个参数是一个字面值,哪一个应该从上下文中获取。。。文档对此非常清楚,请查看example

另外,如果这个name与模型有任何关系,比如说我们想访问permalink,那么添加一个返回带有适当参数的URL的方法可能是最整洁的解决方案。

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

这个“聪明”的东西逻辑不应该在模板中。 在视图中生成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

相关问题 更多 >