2012-08-29 5 views
29

Sto costruendo una rubrica che include le relazioni tra voci, ecc. Ho modelli separati per individui, società, sedi e ruoli. Nella mia pagina di indice vorrei elencare tutte le istanze di ciascun modello e quindi filtrarle. In modo che una persona possa facilmente cercare e trovare una voce. Sono stato in grado di elencare un unico modello utilizzando viste generici e utilizzare get_extra_context di mostrare più un modello:Django passa più modelli a un modello

#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 

Sono anche in grado di elencare un unico modello con una visualizzazione personalizzata:

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

Qui sono l'urls.py per entrambe le prove: "Come faccio a modificare questo di passare più di un modello per il modello"

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

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

     ), 

quindi la mia domanda è È possibile? Tutte le domande simili su StackOverflow richiedono solo due modelli (che possono essere risolti usando get_extra_context).

risposta

11

ti suggerisco di rimuovere la visualizzazione object_list,

definire un dizionario per questa vista specifica,

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

e poi negli URL:

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

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

Grazie! Questo è esattamente ciò di cui avevo bisogno. –

+1

+1 era sorprendentemente difficile trovare questa informazione. Grazie! –

+1

Vorrei che ci fosse qualche spiegazione reale. – kevr

45

ho finito per modificare @thikonom La risposta di utilizzare le visualizzazioni basate su classi:

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 

e nel mio urls.py

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

ciao @Nahanaeli posso chiedere come sarà il modello quando si hanno due modelli? – noobes

+0

Ottima risposta. Potrei chiedere, e se hai bisogno di ottenere informazioni passate dal parser dell'URL allo stesso tempo? Diciamo che stavamo prendendo la chiave primaria dell'individuo (come nella domanda), e dovevamo usarla per filtrare la lista delle sedi. Non sono sicuro di come il metodo get_context_data possa ricevere quell'identificatore. – AlanSE

+0

Ottima risposta, esattamente quello che stavo cercando ... +1! –

5

Se si vuole costruire su Django 1.5 si sarà in grado di utilizzare la versione stabile di CBVS. Si prega di trovare il codice qui sotto.

Grande doc potete trovare qui 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

Cosa c'è di sbagliato nella mia risposta? – grillazz

+0

Penso che sia semplicemente eccessivo – Rexford

+2

Scusate ma non riesco a vedere niente di eccessivo;) – grillazz