2012-11-17 88 views
1

我想做一個ListView接受可選參數作爲查詢集的過濾器使用。Django動態過濾與M2M領域的optiona參數

現在,我已經我的模型:

class Author(models.Model): 
    name = models.CharField(max_length=100, default='') 
    surname = models.CharField(max_length=100, default='') 

    def __unicode__(self): 
     return "%s %s" % (self.name,self.surname) 

class Tag(models.Model): 
    name = models.CharField(max_length=100, default='') 


    def __unicode__(self): 
     return "%s" % (self.name) 


class Publication(models.Model): 
    title = models.CharField(max_length=100, default='') 
    authors = models.ManyToManyField(Author,blank=True, null=True) 
    conf = models.CharField(max_length=100, default='') 
    year = models.IntegerField(default=0) 
    tags = models.ManyToManyField(Tag,blank=True, null=True) 

    def __unicode__(self): 
     return "%s" % (self.title) 

,我以這種方式映射的URL

URL(R '^出版物/(P *)/?',PublicationList.as_view (),名稱=「出版物清單」),

的想法是publications後可選參數追加,像 year=2012year=2012&tags=foodyear=2012&tags=food,car&authors=bobby 這樣的東西,給我FR eedom在做過濾。 順便說一句,這是正確/標準的方式來通過網址傳遞多個參數?

現在,我這的ListView類

class PublicationList(ListView): 
template_name = 'publications.html' 
context_object_name='pubs' 

def get_queryset(self): 
    ... 

self.kwargs['optional']我可以得到這些參數的完整字符串。但是:我是否必須對數據執行所有過濾操作? 所以做分裂&然後在結果列表(args)做一個for並檢查每個值(arg)如果是年份(arg=='year')然後做filter(year=arg)

有沒有什麼能爲我或更好的事情做到這一點?

此外,由於我與標籤和作者有m2m的關係,我如何對標籤進行相同的過濾?基本上我必須檢查標籤值是否與M2M關係中的任何tag.name匹配。

回答

1

我強烈建議或者使用django-filter,或考慮看看它是如何做的事情一樣。本質上它需要表單輸入,並使用從表單傳入的參數構建查詢集。

您試圖解決的問題在一般情況下並不容易。

+0

你知道這個的一個運行的例子嗎?我試圖理解它究竟做了什麼。 – EsseTi

+0

或多或少與django admin相同。它像這樣配置URL:http://www.domain.com/view/?relatedmodel__field = blah&field = yes&otherrelatedmodel__field = something'並且查詢參數直接傳遞給一個'filter'作爲kwargs –

+0

Josh,難道你不知道如果這個應用程序使用_exactly_與django管理應用程序相同的代碼? –