クエリセットのフィルターとして使用されるオプションのパラメーターを受け入れる ListView を実行しようとしています。
今、私は私のモデルを持っています:
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'^publications/(?P.*)/', PublicationList.as_view(), name='publication-list'),
アイデアは、フィルタリングを自由に実行できるように、のようなpublications
ものなどの後に
year=2012
オプションのパラメーターを追加することです。ところで、これはURL経由で複数のパラメータを渡す正しい/標準的な方法ですか?year=2012&tags=food
year=2012&tags=food,car&authors=bobby
今、私はこのListViewクラスを持っています
class PublicationList(ListView):
template_name = 'publications.html'
context_object_name='pubs'
def get_queryset(self):
...
パラメータの完全な文字列をself.kwargs['optional']
取得できます。しかし:フィルタリングを行うために、データに対してすべてのケースを実行する必要がありますか? それで分割を行い、結果のリストに対してforを実行し(args
)、各値をチェックし()arg
、それが年であるかどうかを確認します( )。arg=='year'
filter(year=arg)
私のためにこれを行うものはありますか?
さらに、私はタグや作成者と m2m の関係を持っているので、たとえばタグに対して同じフィルタリングを行うにはどうすればよいですか? 基本的に、タグの値tag.name
が M2M 関係のいずれかと一致するかどうかを確認する必要があります。
チャオ