2013-02-11 10 views
8

クラスベースのビューの前に、urlsconfで渡すことができるextra_contextキーワードがありました。 クラスベースの汎用ビューで今https://docs.djangoproject.com/en/1.3/topics/generic-views/#adding-extra-contextクラスベースの一般的なビューextra context

、我々は我々が簡単な何かをしたい場合は汎用ビューに https://docs.djangoproject.com/en/1.3/topics/class-based-views/#adding-extra-context

をサブクラス化する必要がある、と私たちは、一般的なCREATEVIEWとUpdateViewを使用している同じことを行いたい場合。このアプローチは、これまでのことが些細だったことのためにサブクラス化することを余儀なくされます。さらに、DRYの原則を破る必要があります。

なぜこのようなのですか? 追加のコンテキストをテンプレートに直接渡すことができない理由はありますか?

おかげ

答えて

13

あまりにも多くの考えの後、唯一の答えはNOです、その機能は削除されました。

ドキュメントには「削除された機能」が記載されていないため、このような理由が説明されていません。

でも簡単に私の人生を作るために、私は@aidanからアドバイスを取って、今、私は私がURLSconfに直接使用してにextra_contextの値辞書を渡すことができます半の一般的な見解を持って少し

class ExtraContext(object): 
    extra_context = {} 

    def get_context_data(self, **kwargs): 
     context = super(ExtraContext, self).get_context_data(**kwargs) 
     context.update(self.extra_context) 
     return context 

class ExtraListView(ExtraContext, ListView): 
    pass 

class ExtraDetailView(ExtraContext, DetailView): 
    pass 

class ExtraUpdateView(ExtraContext, UpdateView): 
    pass 

class ExtraCreateView(ExtraContext, CreateView): 
    pass 

class ExtraDeleteView(ExtraContext, DeleteView): 
    pass 

class ExtraCloneView(ExtraUpdateView): 
    def post(self, request, *args, **kwargs): 
     return ExtraCreateView.as_view(model=self.model, 
           template_name=self.template_name, 
           extra_context=self.extra_context)(request, *args, **kwargs)  

を修正as_view()上記の回答を読ん

url(r'^camera/(?P<pk>\d+)/$', 
    views.ExtraDetailView.as_view(model=models.Camera, 
           extra_context={'action_type': 'detail', 'mod_name' : 'camera'}, 
           template_name='cameras/camera_detail.html'), 
    name='camera_detail'), 
+0

私は助けることができてうれしい。 –

+0

このソリューションをありがとうございました。私はクラスベースのURLの一般的なビューについて私のプロジェクトのほぼすべてを行いましたが、これがなければすべてを変更する必要がありました。 – guinunez

8

私はそれはそれほど単純ではないと思うが、それはまだ、コードの唯一の5行です - あなたは本当にクラスベースのビューでその機能が必要な場合は

class MyView(CreateView): 
    def get_context_data(self, *args, **kwargs): 
     context = super(MyView, self).get_context_data(*args, **kwargs) 
     context['my_additional_context'] = my_object 
     return context 

、おそらくあなたが拡張することができ

class MyCreateView(CreateView) 
    additional_context = {} 
    def get_context_data(self, *args, **kwargs): 
     context = super(MyView, self).get_context_data(*args, **kwargs) 
     context.append(self.additional_context) 
     return context 

を次に、あなたのurl_confでそれを使用する - - それを追加するクラス

urlpatterns = patterns('', 
    #.... 
    (r'^my_url/$', MyCreateView.as_view(additional_context={'my_addional_context': my_object})), 
) 

独自のCreateView、DetailView、ListViewなどを記述し、それらをすべてのプロジェクトにインポートすることができます。

+0

問題は汎用ビューをサブクラス化する方法ではなく、問題はこの機能が削除されたことです。 – fariza

+0

ええ、そうですね。あなたの質問には本当に答えがありません。私はなぜそれが削除されたのか分からない。 –

+0

これはうまくいくでしょうが、古いDjangoのルール "urlファイルのURLビューに何も渡さないでください!"これはそれをより遅くするでしょう!django(本)の2つのスクープからリソース –

5

を呼び出し、問題を解決しながら、このアプローチは、基本的に古い機能を取り戻すためのハックだったようです。ちょっとグーグルが「adding extra context」というタイトルのセクションを含むgeneric class-based views pageを公開しました。

from django.views.generic import DetailView 
from books.models import Publisher, Book 

class PublisherDetail(DetailView): 

    model = Publisher 

    def get_context_data(self, **kwargs): 
     # Call the base implementation first to get a context 
     context = super(PublisherDetail, self).get_context_data(**kwargs) 
     # Add in a QuerySet of all the books 
     context['book_list'] = Book.objects.all() 
     return context 

ここでの最大の利点は、あなたが「ハック」するために必要とされていないということです:ちょうどソリューションを使用すると、テンプレートに渡したい変数が含まれるであろうget_context_data()の独自のバージョンを実装するだけで、ここに要約しますurls.pyにすべての種類のコンテキスト引数を含めるには、カスタム定義のコンテキストコンテンツを提供しながら、クラスベースのビューが提供するすべての機能を利用できます。

+0

これは正確に受け入れられた答えではありませんか? – fariza

+0

@fariza - コードは同じですが、違いはアプローチです。受け入れられた答えは上記のコードを使用してデータを 'as_view'に渡します(正しく理解している場合)。これは、 'urls.py'の内容を変更することなく、引数をテンプレートに直接渡すコードを使用することを示唆しています。 – eykanal

+0

元の質問は、削除された機能とそれを元に戻す方法に関するものでした。その機能は、urls.pyから特別なコンテキストを受け入れた一般的なビューを暗示していました – fariza

関連する問題