web-dev-qa-db-fra.com

Django Passer plusieurs modèles à un modèle

Je construis un carnet d'adresses qui inclut les relations entre les entrées, etc. J'ai des modèles distincts pour les individus, les entreprises, les sites et les rôles. Sur ma page d'index, je voudrais répertorier toutes les instances de chaque modèle, puis les filtrer. Pour qu'une personne puisse facilement rechercher et trouver une entrée. J'ai pu répertorier un seul modèle à l'aide de vues génériques et utiliser get_extra_context pour afficher un autre modèle:

#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

Je peux également lister un seul modèle en utilisant une vue personnalisée:

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

Voici les urls.py pour ces deux tests:

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

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

         ),

Ma question est donc "Comment puis-je modifier cela pour passer plus d'un modèle au modèle?" Est-ce même possible? Toutes les questions similaires sur StackOverflow ne concernent que deux modèles (qui peuvent être résolus en utilisant get_extra_context).

35
Nahanaeli Schelling

Je vous suggère de supprimer votre object_list vue,

définir un dictionnaire pour cette vue spécifique,

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

puis dans vos URL:

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

(r'^$', list_detail.object_list, all_models_dict),
18
thikonom

J'ai fini par modifier la réponse de @thikonom pour utiliser des vues basées sur les classes:

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

et dans mon urls.py

url(r'^$', 
    IndexView.as_view(),
    name="home_list"
        ),
52
Nahanaeli Schelling

Si vous voulez le construire sur Django 1.5 vous pourrez utiliser une version stable des CBV. Veuillez trouver le code ci-dessous.

Grand doc que vous pouvez trouver ici 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)
7
grillazz