2012-08-29 22 views
29

Girişler arasındaki ilişkileri içeren bir adres defteri oluşturuyorum. Kişiler, Şirketler, Mekanlar ve Roller'ler için ayrı modellerim var. İndeks sayfamda, her modelin tüm örneklerini listelemek ve ardından filtrelemek istiyorum. Böylece bir kişi kolayca bir girişi arayabilir ve bulabilir.Django Bir Şablona Birden Çok Model Geçme

#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 

Ben de özel bir görünüm kullanarak tek bir model listelediðimden: Burada

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

bir daha modeli göstermek için jenerik görünümleri kullanarak tek bir model listelemek ve get_extra_context kullanmak mümkün olmuştur Bu testlerin her ikisi için urls.py şunlardır: "Nasıl bu şablona daha sonra bir modeli geçmesine değiştiririm"

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

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

     ), 

benim soru yani Bu mümkün mü? StackOverflow'taki benzer soruların tümü sadece iki model hakkında sorular soruyor (get_extra_context kullanarak çözülebilir). Ben size object_list görünümünü kaldırmak önermek

cevap

11

,

bu özel görünüm için bir sözlük tanımlamak, URL'lerinizdeki

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

ve sonra:

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

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

teşekkür ederiz! Bu tam ihtiyacım olan şey. –

+1

+1 bu bilgiyi bulmak şaşırtıcı derecede zordu. Teşekkürler! –

+1

Keşke gerçek bir açıklama olsun. – kevr

45

Ben @thikonom değiştirerek sona erdi sınıf tabanlı görünümleri kullanmanın cevabı:

ve size CBVs kararlı sürümü kullanmak mümkün olacak Django 1.5 üzerine inşa etmek istiyorsanız benim urls.py

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

hi @Nahanaeli İki modeliniz olduğunda şablonun nasıl görüneceğini sorabilir miyim? – noobes

+0

Harika cevap. Soru sorabiliyorum, eğer url ayrıştırıcısı tarafından aynı zamanda iletilen bilgileri almanız gerekiyorsa? Bireyin birincil anahtarını (sorudaki gibi) aldığımızı ve mekan listesini filtrelemek için bunu kullanmamız gerektiğini söyledi. Get_context_data yönteminin bu tanımlayıcıyı nasıl alacağı konusunda emin değilim. – AlanSE

+0

Harika bir cevap, tam olarak aradığım şey ... +1! –

5

içinde. Lütfen aşağıdaki kodu bulun.

Büyük doc burada bulabilirsiniz 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

Cevabımın nesi var? – grillazz

+0

Ben sadece overkill – Rexford

+2

Üzgünüm ama overkilling hiçbir şey göremiyorum;) – grillazz

İlgili konular