我想做一個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=2012
或year=2012&tags=food
或year=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
匹配。
僑
你知道這個的一個運行的例子嗎?我試圖理解它究竟做了什麼。 – EsseTi
或多或少與django admin相同。它像這樣配置URL:http://www.domain.com/view/?relatedmodel__field = blah&field = yes&otherrelatedmodel__field = something'並且查詢參數直接傳遞給一個'filter'作爲kwargs –
Josh,難道你不知道如果這個應用程序使用_exactly_與django管理應用程序相同的代碼? –