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

輸出網址應該會像:

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

凡ARGS是開始的參數,ZZ是「=」和QQ是一個「&」等效。

首先:這會工作,但我得到的custid = name.id進來的add_args(),我想有custid = 11進來。如何通過id作爲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作爲它的值...

回答

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

3

你打電話argz.join幾次,永遠不會將結果分配給任何東西:也許你正在操作的誤解,認爲join一個字符串的方法有一些神祕的副作用,但它不會 - 它只是返回一個新的字符串,並且如果你對這個新的字符串沒有做任何事情,它就不見了。這至少是你的問題的一部分...?

+0

好抓!我輸入了所有內容......錯過了作業。對Python也是新的。試圖擺脫PHP,但我發現Django的學習曲線非常陡峭。隨着API不斷變化並被淘汰和淘汰,這是一個動態的目標。 – un33k 2009-05-22 17:58:31

+1

PHP不是Django。你無法比較兩者。首先你學習python。然後你學習Django。爲什麼要將類似PHP的心態帶入Django Web框架? – drozzy 2009-05-26 17:02:22

+0

PHP用於解釋預期的行爲。所以,我知道我想要什麼,我知道它是如何在PHP中完成的,現在試圖找出我如何將PHP留在後面並轉移到PyDj。 – un33k 2009-05-27 17:53:23

4

你不可錯過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。