2012-04-09 80 views
1

我在做這將從查詢集來顯示對象列表的通用模板:在Django中基於捕獲的URL參數過濾QuerySet?

{% for o in objects %} 
    {{ o.name }} 
{% endfor %} 

我希望能夠使用在多個場合,模板,其中不同類型的過濾和排序需要做完了。我創建了一個視圖功能是:

def display_objects(request, filters, orders, template_name): 
    objects = Object.objects.all() 
    for filter in filters: 
     objects = objects.filter(('%s__%s' % (filter['field'], filter['relationship']), filter['value'])) 
    for order in orders: 
     objects = objects.order_by('-' if 'descending' in order else '' + order['field']) 
    # render objects to template with context 
    pass 

我不知道如果我做了什麼至今仍然工作,但我碰到的一個問題。我不知道用當前函數過濾URL中捕獲的參數設置的查詢是否可行。

例如,如果我想顯示與特定的用戶我會做一些這樣的對象:

(r'^user/(?P<account_username>[^/]+)/$', display_objects, dict(filters=[{'field':'account__username','relationship':'iexact','value':account_username}], orders=[{'field':'foobar'}], template_name='user.html')) 

顯然,account_username是不是一個定義的字段,直到URL被解析並分發到display_objects功能。製作一個帶有account_username參數的視圖函數會很容易,但我希望能夠使用該函數來顯示其他對象查詢集,這些查詢集將用不同的捕獲參數進行過濾。

是否有某種方法可以將捕獲的URL參數傳遞給視圖函數來動態地過濾或排序查詢集以顯示?

回答

1

這裏是你可以做到這一點的一種方法:

在urls.py

(r'^user/(?P<account_username>[^/]+)/$', display_objects, dict(filters=[{'field':'account__username','relationship':'iexact'}], orders=[{'field':'foobar'}], template_name='user.html')) 

然後在views.py:

def display_objects(request, filters, orders, template_name, **kwargs): 

    objects = Object.objects.all() 
    for filter in filters: 
     objects = objects.filter(('%s__%s' % (filter['field'], filter['relationship']), kwargs.get(filter['field']))) 
    for order in orders: 
     objects = objects.order_by('-' if 'descending' in order else '' + order['field']) 
    # render objects to template with context 
    pass 

雖然老實說,我不知道是否這是做事情的好方法...

+0

正如我想到的那樣,我意識到,我構建視圖函數的方式可能不是最優的。對於如何動態過濾併爲模板排序查詢集,您有任何建議嗎? – mburke13 2012-04-09 22:52:45

0

您不能直接將字符串傳遞給filter方法。你需要把它翻譯成kwargs。

query_string = '%s__%s' % (filter['field'], filter['relationship']) 
objects = objects.filter(**{query_string: filter['value']})) 
+0

我不知道什麼時候發生這種情況,但他的語法在1.4A'obj.filter(('key','value'))''上工作。我也抓住了我的警惕,但它接受了鍵/值元組。 !? – 2012-04-09 23:13:00

+0

哇。剛剛在1.3.1上測試過,並在那裏工作。 – 2012-04-09 23:17:09