2012-03-15 8 views
0

私はPythonには新しく、Django 1.3のクラスベースの汎用ビューを理解しようとしています。Django Generic Views:新しいプロパティを割り当てるには?

class category_detail(ListView): 
    """Return a generic view of locations in a category.""" 

    def get_context_data(self, **kwargs): 
     # Call the base implementation first to get a context. 
     context = super(category_detail, self).get_context_data(**kwargs) 
     # Add the current category to the context. 
     category = get_object_or_404(Category, slug=self.kwargs['slug']) 
     context['category'] = category 
     return context 

    def get_queryset(self): 
     category = get_object_or_404(Category, slug=self.kwargs['slug']) 
     return Location.objects.filter(category=category) 

それは、私はそれが何をするかをしたいん:今、私は、カテゴリ内のLocationオブジェクトのリストを取得し、次のビューを持っています。しかし、あなたはcategoryを2回定義して自分自身を繰り返していることがわかります。 categoryというクラスに新しいプロパティを追加する方法がありますか?self.categoryget_queryset()get_context_data()に一度定義してください。私はあなたが別の角度からそれに接近するべきだと思う、それはself.category()

答えて

3

にアクセスできるようになりデコレータせず、

+0

+1。また、 'get_context_data'メソッドを完全に削除し、' {%with location_list = category.location_set.all%} 'をテンプレートに追加することで、コードをさらに単純化することができます。 –

+0

これは私がやろうとしていたことよりもはるかに理にかなっています。ありがとう! – user1272534

1

は、あなたのクラス内@propertyデコレータ

@property 
def category(self): 
    return get_object_or_404(Category, slug=self.kwargs['slug']) 

を使用して、あなたはself.categoryとしてそれにアクセスすることができますあなたはのCategoryを表示するListViewを使用してはならないが、そのカテゴリのLocationsも含むCategoryDetailViewを使用しないでください。ビュークラスの名前は、カテゴリの詳細ビューを表示していることを示唆しています。

これで、テンプレートで使用できるカテゴリと場所の両方のコンテキストがカテゴリに追加されました。

2

カテゴリをselfに割り当ててください。唯一注意しなければならないことは、あなたがそれをどこで行うかについて少し注意する必要があるということです。しかし、get_querysetは、ビューでアクティブに最初のものの一つであり、それが正常に動作します:

def get_queryset(self): 
    self.category = get_object_or_404(Category, slug=self.kwargs['slug']) 
    return Location.objects.filter(category=self.category) 

def get_context_data(self, **kwargs): 
    # Call the base implementation first to get a context. 
    context = super(category_detail, self).get_context_data(**kwargs) 
    # Add the current category to the context. 
    context['category'] = self.category 
    return context 

FWIWが、これは実際に​​(第3のコードサンプルダウン)によって使用される正確な方法です。

関連する問題