41

エントリ間の関係などを含むアドレス帳を作成しています。個人、会社、会場、および役割に対して個別のモデルがあります。インデックス ページで、各モデルのすべてのインスタンスを一覧表示し、それらをフィルター処理したいと考えています。人がエントリを簡単に検索して見つけることができるようにします。汎用ビューを使用して 1 つのモデルを一覧表示し、get_extra_context を使用してもう 1 つのモデルを表示することができました。

#views.py

 class IndividualListView(ListView):

    context_object_name = "individual_list"
    queryset = Individual.objects.all()
    template_name='contacts/individuals/individual_list.html'


class IndividualDetailView(DetailView):

    context_object_name = 'individual_detail'
    queryset = Individual.objects.all()
    template_name='contacts/individuals/individual_details.html'

    def get_context_data(self, **kwargs):
        context = super(IndividualDetailView, self).get_context_data(**kwargs)
        context['role'] = Role.objects.all()
        return context

カスタム ビューを使用して単一のモデルを一覧表示することもできます。

#views.py
def object_list(request, model):
    obj_list = model.objects.all()
    template_name = 'contacts/index.html'
    return render_to_response(template_name, {'object_list': obj_list}) 

これらのテストの両方の urls.py は次のとおりです。

(r'^$', views.object_list, {'model' : models.Individual}),

(r'^individuals/$', 
    IndividualListView.as_view(),
        ),
(r'^individuals/(?P<pk>\d+)/$',
    IndividualDetailView.as_view(),

         ),

だから私の質問は、「これを変更して、複数のモデルをテンプレートに渡すにはどうすればよいですか?」ということです。それは可能ですか?StackOverflow に関する同様の質問はすべて、2 つのモデルについてのみ質問しています (これは get_extra_context を使用して解決できます)。

4

3 に答える 3

66

@thikonom の回答を変更して、クラスベースのビューを使用することになりました。

class IndexView(ListView):
    context_object_name = 'home_list'    
    template_name = 'contacts/index.html'
    queryset = Individual.objects.all()

    def get_context_data(self, **kwargs):
        context = super(IndexView, self).get_context_data(**kwargs)
        context['roles'] = Role.objects.all()
        context['venue_list'] = Venue.objects.all()
        context['festival_list'] = Festival.objects.all()
        # And so on for more models
        return context

そして私のurls.pyで

url(r'^$', 
    IndexView.as_view(),
    name="home_list"
        ),
于 2012-09-10T18:31:57.217 に答える
24

object_listビューを削除することをお勧めします。

この特定のビューの辞書を定義し、

   all_models_dict = {
        "template_name": "contacts/index.html",
        "queryset": Individual.objects.all(),
        "extra_context" : {"role_list" : Role.objects.all(),
                           "venue_list": Venue.objects.all(),
                           #and so on for all the desired models...
                           }
    }

そしてあなたのURLで:

#add this import to the top  
from django.views.generic import list_detail

(r'^$', list_detail.object_list, all_models_dict),
于 2012-08-29T23:22:57.063 に答える
9

Django 1.5 でビルドする場合は、安定したバージョンの CBV を利用できます。以下のコードを見つけてください。

ここで見つけることができる素晴らしいドキュメントhttps://docs.djangoproject.com/en/dev/topics/class-based-views/mixins/

class ProductsCategoryList(ListView):
    context_object_name = 'products_list'
    template_name = 'gallery/index_newborn.html'

    def get_queryset(self):
        self.category = get_object_or_404(Category, name=self.args[0])
        return Products.objects.filter(category=self.category)

    def get_context_data(self, **kwargs):
        kwargs['category'] = Category.objects.all()
        # And so on for more models
        return super(ProductsCategoryList, self).get_context_data(**kwargs)
于 2013-05-18T13:43:53.230 に答える