2011-09-27 14 views
0

「ブログ」という名前の「エントリー」というモデルを持つアプリがあります。私はクラスベースのジェネリックを使用してこのエントリを表示し、これに満足しています。クラスベースの汎用ビューに2つのモデルを渡すにはどうすればいいですか

今度は、「イベント」というモデルを持つ「イベントアプリケーション」という別のアプリが登場します。今私はいくつかのイベントのこのモデルを照会し、上記のクラスベースのジェネリックに送信したいと思います。これはどうすればいいですか?

urlpatterns = patterns('', 

    url(r'^$', ArchiveIndexView.as_view(
     model=Entry, paginate_by=5, date_field='pub_date',template_name='homepage.html'), 
     ), 

    url(r'^(?P<year>\d{4})/(?P<month>[a-z]{3})/(?P<day>\w{1,2})/(?P<slug>\w+)/$', 
    DetailView.as_view(model=Entry, queryset=Entry.objects.all(), slug_field='slug')),) 

何とかArchiveIndexView.as_view()DetailView.as_view()にイベントモデルを渡す方法があります:ここで

は、私はエントリーモデルを表示するために、これまで私のurls.pyに持っているものでしょうか?

答えて

1

複数のページでイベントを開催したいと考えているので、context processorが適切なツールです。それはあなたがすべてのテンプレートのコンテキスト内でのイベントのクエリセットにアクセスできるようにする必要があります。

from eventapp.models import Event 

def event_provessor(request): 
    return {'events': Event.objects.all()}  

ため、クエリセットの怠惰のリストを必要としない場合は、データベースを打つことを恐れる必要はありません、照会はeventsを反復する場合にのみ実行されます。

もちろん、あなたも可能です。ビューをサブクラス化してその中のイベントをコンテキストに追加しますが、複数のビューが影響を受ける場合は、コンテキストプロセッサがより意味をなさないことがあります。

+0

私はこれをより多くのビューで使用するので、コンテキストプロセッサは理にかなっています。私はベニロープの答えからも多くを学びました。あなたがた両方に感謝します。 – Trewq

1

Djangoのクラスベースのビューを使用しているので、使用しているクラスを拡張するだけです。 DetailViewについては

、あなたのアプリのviews.pyファイルで、あなたの新しいビュークラスを追加します。

from django.views.generic import DetailView 
from blog.models import Entry 
from eventapp.models import Event 

class BlogEntryView(DetailView): 
    """Extends the detail view to add Events to the context""" 
    model = Entry 

    def get_context_data(self, **kwargs): 
     context = super(BlogEntryView, self).get_context_data(**kwargs) 
     context['events'] = Event.objects.all() 
     return context 

にDetailViewクラスのデフォルトモデル名を与えられたので、私たちは、クエリセットとslugフィールド名を残していますEntry.objects.all() queryset、 'slug'はデフォルトのスラッグフィールド名です。明示的に宣言したい場合は、modelの割り当てのすぐ下に追加します。

from blog.views import BlogEntryView 

urls = patterns('', 
    url(r'^$', ArchiveIndexView.as_view(
     model=Entry, paginate_by=5, 
     date_field='pub_date',template_name='homepage.html'), 
    ), 
    url(r'^(?P<year>\d{4})/(?P<month>[a-z]{3})/(?P<day>\w{1,2})/(?P<slug>\w+)/$', 
     BlogEntryView.as_view()), 
) 

これが起動するように、class based generic view documentationで詳細です:

は、そのように、あなたのようなurls.pyファイルを更新します。

関連する問題