2016-09-14 18 views
0

私はcbt generic listview 2つのスラッグでフィルタリングしたい。しかし、slug_url_kwargsは、単一の文字列を渡すことしかできません。複数のスラッグをサポートするにはどうすればslug_url_kwargを更新できますか?または私は他に何ができますか?クラスベースのビューdjango複数のスラッグ

だから私は私のコードは、そのような似ています。このモデルとビュー機能

class SaityProfile(models.Model): 
    user = models.ForeignKey(User, default=0) 
    about = models.CharField(max_length=255, blank=True) 
    name = models.CharField(max_length=255) 
    url = models.CharField(max_length=255, unique=True) 

    def __unicode__(self): 
     return self.name 

class Saity(models.Model): 
    profile = models.ForeignKey('SaityProfile', null=True) 
    user = models.ForeignKey(User, null=True) 
    name = models.CharField(max_length=250) 
    url = models.CharField(max_length=250, default=gen_slug_page) 
    desc = models.CharField(max_length=250, blank=True) 
    order = models.IntegerField(default=1) 

    def get_absolute_url(self): 
     return reverse('sites:website_pages', kwargs={'website_slug': self.url}) 

class WebsitesProfileList(generic.ListView): 
    model = Saity 
    slug_field = 'url' 
    slug_field_kwargs = 'profile_url' 
    template_name = 'saity_ds/websites_profile_list.html' 

    def get_context_data(self, **kwargs): 
     self.profile = SaityProfile.objects.get(url=self.kwargs['profile_url']) 
     extra_context = { 
      'profile': self.profile 
     } 
     context = super(WebsitesProfileList, self).get_context_data(**kwargs) 
     context.update(extra_context) 
     return context 

を持っています。私は新しい機能を追加したい。私はクラスベースのビューを選択しました。私は間違いだと思います。それは不明です。

+0

'ListView'は' slug_url_kwarg'をまったく使用しません。 URLパターン、モデル、フィルタリングするフィールドなど、より多くの情報を含めるように質問を編集してください。 – Alasdair

+0

ありがとう、私は、私は2つのスラグがあり、私はスラグkwargsに基づいてフィルタリングをしたい場合は、urlconfのスラッグを意味する? –

+0

私は尋ねたように、あなたの質問にそれ以上の情報を追加していません。あなたのモデル、スラッグフィールドの名前、URLパターン、これまでのところあなたのビューで試したことがあれば、あなたの質問に答える方がはるかに簡単です。あなたがその情報を含んでいない場合、あなたは私たちに例を考案するように求めています。そうすれば答えが難しくなるので、返事がないかもしれません。 – Alasdair

答えて

0

slug_url_kwargを設定する必要はありません。 get_querysetをオーバーライドし、表示するクエリセットを返します。

class WebsitesProfileList(generic.ListView): 
    def get_queryset(self): 
     return Saity.objects.filter(url=self.kwargs['url'], profile=self.kwargs['profile']) # You will probably have to change this 
    ... 
+0

私はきれいな短い構成について夢見る、私はスーパー機能について怖いよ –

+0

ええ、私はどのようにフィルタを追加して使用するか分かっている。私はメソッドをオーバーライドするのが好きではない、私はそれがきれいな方法を持っていると思った。 –

+0

'get_queryset'をオーバーライドすることは[標準的な手法](https://docs.djangoproject.com/ja/1.10/topics/class-based-views/generic- display /#dynamic-filtering)をDjangoジェネリッククラスベースのビューに追加しました。 'ListView'は' slug_field_kwarg'オプションを全く持っていないので、私はこの場合に別のアプローチを考えることはできません。私の例で 'super()'を呼び出す必要はありません。あなたは明示的に 'Saity.objects.filter()'を呼び出しています(必要なら 'super()'を使うように調整することができます)。 – Alasdair

関連する問題