2009-05-22 5 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 

Выход URL должен выглядеть следующим образом:

http://foo.org/john-smith-ARGScustidZZ11QQsortidZZ2 

Где ARGS этого начало аргументы, ZZ равен '=', а QQ - эквивалент '&'.

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

Кроме того, есть способ просто отправить массив значений key =>, как в PHP. В PHP я хотел бы построить массив, скажем:

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

Тогда я бы передать список аргументов в качестве аргумента в add_args() и в add_args() я бы

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

Кто-нибудь есть лучший способ делая эту работу?

Примечание: если мне нужно передать все аргументы в виде строки и разделить их на фильтр, я не против. Я просто не знаю, как передать name.id как его значение ...

ответ

6

Эта логика «умных» вещей не должна находиться в шаблоне. Создайте свой конец из-URLs на ваш взгляд, а затем передать их в шаблон:

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 на модели.

+0

вещи, подобные идентификатору sort, находятся за пределами объектной модели. Итак, я думаю, они должны быть переданы. И если мне нужно передать аргументы здесь и там, я могу просто передать его фильтру. все, что я пытаюсь сделать, это сделать http://foo.com/some-slugy-stuff-ArgsID22Sort2/. Таким образом, каждая ссылка знает, что загружать, и если вы копируете и вставляете и отправляете друзьям по электронной почте, они могут точно видеть, что вы хотите видеть. Поверьте мне, я знаю, как это сделать Django. Думаю, никто не знает или не удосужился опереться на то, как передать несколько аргументов фильтру. Спасибо за ваш повтор! – un33k

+0

Зачем использовать args для сложных тегов вместо использования именованных URL-адресов? – drozzy

+0

+1 для рекомендации 'get_absolute_url'. Вот хорошее [сообщение в блоге] (http://www.achanceofbrainshowers.com/blog/tech/2010/11/29/djangos_permalink_decorator/) о декораторе 'permalink', чтобы использовать его, и как это может быть очень круто. – hangtwenty

3

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

+0

хорошо catch! Я набрал все в ... пропустил задание. Также новичок в python. Попытайтесь уйти от PHP, но я считаю, что кривая обучения Django очень крутая. Это движущаяся цель, поскольку API-интерфейсы постоянно меняются и устаревают и постепенно прекращаются. – un33k

+1

PHP не Django. Вы не можете сравнить эти два. Сначала вы изучаете python. Затем вы изучаете Django. Зачем приносить PHP-подобный менталитет в веб-фреймворк Django? – drozzy

+0

PHP используется для объяснения ожидаемого поведения. Итак, я знаю, чего хочу, я знаю, как это делается на PHP, теперь пытаясь выяснить, как я могу оставить PHP позади и перейти к PyDj. – un33k

4

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

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

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

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

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

В целом, я бы воздержался от ввода слишком много логики в шаблоны. Django - это не PHP.

+0

То, что я хочу достичь этой строкой ({{name}}), это: взять имя и фамилию, убейте их. Итак, у нас есть «джон-кузнец». Затем передайте это значение как add_args. Затем передайте значение custid и sortid в качестве аргументов add_args. Затем add_args возвратит текст, подобный «john-smith-argscustidzz1qqsortidzz2». Теперь вы можете перевести строку, которую вы только что предоставили, чтобы увидеть, соответствует ли результат тому, что я ищу. – un33k

+0

Я не уверен, понимаю ли вы, что вы подразумеваете под переводом? Это уже django-шаблон. – muhuk

+0

просто не знаю, что будет делать ваша линия и в каком порядке. Я попробовал, и это не сработало. – un33k

Смежные вопросы