1

クエリセットのフィルターとして使用されるオプションのパラメーターを受け入れる 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=foodyear=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 関係のいずれかと一致するかどうかを確認する必要があります。

チャオ

4

1 に答える 1

1

django-filterを使用するか、それがどのように機能するかを確認することを強くお勧めします。基本的に、フォーム入力を受け取り、フォームから渡されたパラメーターを使用してクエリセットを構築します。

あなたが解決しようとしている問題は、一般的には簡単ではありません。

于 2012-11-17T11:20:54.637 に答える