2012-08-29 2 views
29

항목 간 관계가 포함 된 주소록을 작성하고 있습니다. 개인, 회사, 개최지 및 역할에 대한 별도의 모델이 있습니다. 내 인덱스 페이지에서 각 모델의 모든 인스턴스를 나열한 다음 필터링합니다. 사람이 쉽게 검색하고 항목을 찾을 수 있습니다.Django 여러 모델을 하나의 템플릿으로 전달

#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}) 

을 나는 또 하나의 모델을 보여주기 위해 일반 뷰를 사용하여 하나의 모델을 나열하고 get_extra_context 사용할 수 있었다 이러한 테스트 모두를위한 urls.py 있습니다 : "어떻게이 템플릿에 두 개 이상의 모델을 전달하는 수정 않는다"

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

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

     ), 

그래서 제 질문입니다 심지어 가능할까요? StackOverflow에 대한 비슷한 질문은 모두 두 개의 모델에 대해서만 묻습니다 (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을 수정 결국 님의 답변에 따라 클래스 기반보기 사용 :

당신은 당신이 CBVs의 안정 버전을 사용 할 수 있습니다 장고 1.5에 구축하려면 내 urls.py

url(r'^$', 
    IndexView.as_view(), 
    name="home_list" 
     ), 
+8

안녕하세요 @ Nahanaeli는 두 개의 모델이있을 때 템플릿이 어떻게 생겼는지 물어볼 수 있습니까? – noobes

+0

좋은 답변입니다. 같은 시간에 파서가 전달한 정보를 얻으려면 어떻게해야할까요? 우리가 개인의 기본 키를 물어 보는 중입니다 (질문 에서처럼), 우리는 이것을 사용하여 장소 목록을 필터링해야했습니다. 메소드 get_context_data가 그 식별자를 어떻게받을 수 있는지 나는 확신 할 수 없다. – AlanSE

+0

위대한 답변, 정확히 내가 뭘 찾고 있었는지 ... +1! –

5

에서 3,516,. 아래 코드를 찾으십시오.

큰 문서 당신이 여기에서 찾을 수 있습니다 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

관련 문제