Django - как использовать фильтр тегов с несколькими аргументами - PullRequest
2 голосов
/ 22 мая 2009

У меня есть несколько значений, которые я хотел бы передать в фильтр и получить из него 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 - «&» эквивалент.

Прежде всего: это сработает, но я получаю custid = name.id, поступающий в add_args (), где я хочу, чтобы в него вошел custid = 11. Как передать 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 в качестве значения ...

Ответы [ 3 ]

6 голосов
/ 26 мая 2009

Эта «умная» штука логики не должна быть в шаблоне. Создайте свой конец 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 на модели.

4 голосов
/ 22 мая 2009

Вы не можете передать name.id в ваш фильтр. Аргументы фильтра могут быть как одним значением, так и одним литералом. Python / Django не пытается заменить любую «умную» переменную, такую ​​как PHP.

Я предлагаю вам создать тег для этой задачи:

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

Таким образом, вы можете узнать, какой аргумент является литеральным значением, а какой - из контекста и т. Д. Документы достаточно ясны по этому поводу, посмотрите на пример .

Также, если это name каким-либо образом связано с моделью, скажем, мы хотим получить постоянную ссылку, добавление метода, который возвращает URL с правильными аргументами, может оказаться самым аккуратным решением.

В целом, я бы воздерживался от слишком большой логики в шаблонах. Джанго не PHP.

3 голосов
/ 22 мая 2009

Вы звоните argz.join пару раз и никогда не присваиваете результаты чему-либо: возможно, вы работаете в заблуждении, что метод строки join имеет какой-то таинственный побочный эффект, но это не так - - он просто возвращает новую строку, и если вы ничего не сделаете с этой новой строкой, poof , она исчезнет. Это хотя бы часть твоей проблемы ...?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...