【问题标题】:Django -- how to use templatetags filter with multiple argumentsDjango——如何使用带有多个参数的模板标签过滤器
【发布时间】:2010-10-28 03:00:54
【问题描述】:

我想将一些值传递给过滤器并从中获取 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 作为其值传递...

【问题讨论】:

    标签: python django filter django-templates tags


    【解决方案1】:

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

    【讨论】:

    • 排序 id 之类的东西在对象模型之外。所以,我想它们必须被传递。如果我必须在这里和那里传递 args,我可能只是将它传递给过滤器。我要做的就是做foo.com/some-slugy-stuff-ArgsID22Sort2。这样,每个链接都知道加载了什么,如果您复制粘贴并通过电子邮件发送给朋友,他们可以准确地看到您希望他们看到的内容。相信我,我知道如何以 Django 的方式做到这一点。我想没有人知道或费心去学习如何将多个参数传递给过滤器。不过感谢您的重播!
    • 为什么要使用 args 来复杂的标签,而不是使用命名的 url?
    • +1 推荐get_absolute_url。这是一个很好的 blog postpermalink 装饰器与它一起使用,以及它如何非常酷。
    【解决方案2】:

    您不能将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。

    【讨论】:

    • 我想通过这一行实现什么 ({{name}} ) 是:取名字和姓氏,将它们sluify。所以我们有“约翰史密斯”。然后将其作为值传递给 add_args。然后将 custid 和 sortid 的值作为参数传递给 add_args。然后让 add_args 返回类似“john-smith-argscustidzz1qqsortidzz2”的文本。现在您能否翻译一下您刚刚提供的行,看看输出是否符合我的要求。
    • 我不确定我是否理解您所说的translate 的意思?它已经是 django-template。
    • 只是不知道你的生产线会做什么以及按什么顺序。我试过了,还是不行。
    • 哦,除非有人实现它,否则它不起作用。这基本上就是自定义模板标签的想法。我没有给出实现。
    【解决方案3】:

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

    【讨论】:

    • 好收获!我输入了所有内容......错过了作业。也是python的新手。尝试摆脱 PHP,但我发现 Django 的学习曲线非常陡峭。它是一个不断变化的目标,因为 API 不断变化、被弃用和逐步淘汰。
    • PHP 不是 Django。你无法将两者进行比较。首先你学习python。然后你学习 Django。为什么要将类 PHP 的心态带入 Django Web 框架?
    • PHP 用于解释预期的行为。所以,我知道我想要什么,我知道它是如何在 PHP 中完成的,现在我正在尝试找出如何将 PHP 抛在后面并转移到 PyDj。
    猜你喜欢
    • 2019-07-30
    • 2011-10-03
    • 1970-01-01
    • 2012-02-01
    • 2013-03-16
    • 2019-05-02
    • 2020-02-16
    • 1970-01-01
    • 2020-05-02
    相关资源
    最近更新 更多