2012-08-29 12 views
29

私は、エントリ間の関係などを含むアドレス帳を構築しています。私は、個人、企業、会場、および役割について別々のモデルを持っています。私のインデックスページでは、各モデルのすべてのインスタンスをリストし、それらをフィルタリングしたいと思います。人が簡単に検索してエントリを見つけることができるようにします。私は汎用ビューを使用して単一のモデルをリストし、1つの以上のモデルを表示するためにget_extra_context使用することができました:Django複数のモデルを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を使用して解決できます)。私はあなたがあなたのobject_listビューを削除示唆

答えて

11

は、この特定のビューのための辞書を定義し、あなたのURLで

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... 
          } 
    } 

、その後:

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

(r'^$', list_detail.object_list, all_models_dict), 
+0

ありがとうございました!これはまさに私が必要としていたものです。 –

+1

+1この情報を見つけるのは驚くほど困難でした。ありがとう! –

+1

実際の説明がありましたら幸いです。 – kevr

45

私は@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" 
     ), 
+8

こんにちは@Nahanaeliは2つのモデルを持っているとき、テンプレートはどのように見えるのですか? – noobes

+0

素晴らしい答え。私はあなたが情報を同時に取得する必要がある場合、私は尋ねるかもしれません?個人のプライマリキー(質問のように)を取り込んでいるとし、これを使用して会場リストをフィルタリングする必要があったとします。メソッドget_context_dataがその識別子をどのように受け取ることができるかは不明です。 – AlanSE

+0

偉大な答え、まさに私が探していたもの... +1! –

5

あなたはDjangoの1.5上でそれを構築したい場合は、CBVsの安定したバージョンを利用することができるようになります。以下のコードを見つけてください。

グレートドキュメントあなたがここで見つけることができます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) 
+0

私の答えに何が間違っていますか? – grillazz

+0

私はそれがちょっと残念だと思う – Rexford

+2

申し訳ありませんが、私は何もそれを過度に見ることはできません;) – grillazz

関連する問題