Source code for django_crucrudile.routers.model.generic

from django.views.generic.detail import SingleObjectMixin
from django.views.generic.list import MultipleObjectMixin
from django.views.generic import (
    ListView, DetailView,
    CreateView, UpdateView, DeleteView
)

from django_crucrudile.entities.store import provides
from django_crucrudile.routes import GenericModelViewRoute

from . import ModelRouter


@provides(ListView, map_kwargs={'index': True})
@provides(DetailView)
@provides(CreateView)
@provides(UpdateView)
@provides(DeleteView)
[docs]class GenericModelRouter(ModelRouter): """Generic model router, subclasses :class:`django_crucrudile.routers.model.ModelRouter` and use 5 Django generic views for each registered model. Provides specific :class:`django_crucrudile.routes.ModelViewRoute` classes, created for the following Django generic views : - :class:`django.views.generic.ListView` - :class:`django.views.generic.DetailView` - :class:`django.views.generic.CreateView` - :class:`django.views.generic.UpdateView` - :class:`django.views.generic.DeleteView` These classes are registered in the base store, using :func:`django_crucrudile.entities.store.EntityStore.register_class` or the :func:`django_crucrudile.entities.store.provides` decorator. They will be instantiated (with the model as argument) when the router is itself instantiated, using :func:`django_crucrudile.entities.store.EntityStore.register_base_store`. We use our own class mapping, to use our own route, because we want to add the arguments specification to the route automatically. .. inheritance-diagram:: GenericModelRouter >>> # these two lines are required to subclass Django model in doctests >>> import tests.unit >>> __name__ = "tests.doctests" >>> from django.db.models import Model >>> from django_crucrudile.routers import Router, ModelRouter >>> >>> class TestModel(Model): ... pass >>> router = Router(generic=True) >>> >>> router.register(TestModel) is not None True >>> print(router.get_str_tree()) ... # doctest: +NORMALIZE_WHITESPACE - Router @ ^ - GenericModelRouter testmodel @ ^testmodel/ - testmodel-list-redirect @ ^$ RedirectView - testmodel-delete @ ^delete/(?P<pk>\d+)$ DeleteView - testmodel-delete @ ^delete/(?P<slug>[\w-]+)$ DeleteView - testmodel-update @ ^update/(?P<pk>\d+)$ UpdateView - testmodel-update @ ^update/(?P<slug>[\w-]+)$ UpdateView - testmodel-create @ ^create$ CreateView - testmodel-detail @ ^detail/(?P<pk>\d+)$ DetailView - testmodel-detail @ ^detail/(?P<slug>[\w-]+)$ DetailView - testmodel-list @ ^list$ ListView """ @classmethod
[docs] def get_register_class_map(cls): """Override super implementation to set the mapping for Django generic views to :class:`django_crucrudile.routes.GenericModelViewRoute`. For doctests that use this member, see :class:`django_crucrudile.routers.model.generic.GenericModelRouter` """ mapping = super().get_register_class_map() mapping[SingleObjectMixin, MultipleObjectMixin] = ( GenericModelViewRoute.make_for_view ) return mapping