14

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

クラスベースの汎用ビューで、同じことをしたい場合は、汎用ビュー https://docs.djangoproject.com/en/1.3/topics/class-based-views/#adding-extra-contextをサブクラス化する必要があります

シンプルなものが必要な場合は、汎用の CreateView と UpdateView を使用しています。このアプローチは、以前は些細なことだったもののサブクラス化を強制します。さらに、DRY の原則を破る必要があり、それを 2 回行う必要があります。

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

ありがとう

4

5 に答える 5

24

考えすぎた結果、唯一の答えは NO です。その機能は削除されました。

また、ドキュメントには「削除された機能」については言及されておらず、なぜこのようになったのかについての説明もありません。

しかし、生活を楽にするために、@aidan からのアドバイスを参考にして、少し修正しました。

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)    

これで、URLSconf で直接使用して、extra_context dict を 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'),
于 2013-02-12T16:36:44.683 に答える
15

それほど単純ではないと思いますが、それでも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などを作成して、実行するすべてのプロジェクトにインポートできます。

于 2013-02-11T18:02:09.643 に答える
8

上記の回答を読むと、このアプローチは問題を解決しながら、本質的に古い機能を取り戻すためのハックであるように思われました。少しググると、「追加のコンテキストを追加する」というタイトルのセクションを含む、一般的なクラスベースのビュー ページが表示されます。ここで要約すると、ソリューションは、テンプレートに渡したい変数を含む独自のバージョンを実装するだけです。get_context_data()

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

ここでの最大の利点は、あらゆる種類のコンテキスト引数を含めるために「ハック」する必要がないことですurls.py。カスタム定義のコンテキスト コンテンツを提供しながら、クラスベースのビューによって提供されるすべての機能を利用できます。

于 2015-02-16T02:40:28.133 に答える