Ticket #16213: 16213.diff

File 16213.diff, 6.8 KB (added by hvdklauw, 4 years ago)

Added some changes, added a mixin for the crud views to add extra functionality.

  • django/views/generic/base.py

     
    8787    """
    8888    template_name = None
    8989    response_class = TemplateResponse
     90    current_app = None
    9091
    9192    def render_to_response(self, context, **response_kwargs):
    9293        """
    9394        Returns a response with a template rendered with the given context.
    9495        """
     96        default_kwargs = {
     97            'current_app': self.current_app
     98        }
     99        default_kwargs.update(response_kwargs)
    95100        return self.response_class(
    96101            request = self.request,
    97102            template = self.get_template_names(),
    98103            context = context,
    99             **response_kwargs
     104            **default_kwargs
    100105        )
    101106
    102107    def get_template_names(self):
  • django/views/generic/collections.py

     
     1from django.conf.urls.defaults import patterns, url
     2from django.core.exceptions import ImproperlyConfigured
     3from django.db.models.query import QuerySet
     4from django.views import generic
     5
     6class ViewCollection(object):
     7    """
     8        A base class based view collection
     9    """
     10    class_based_views = None
     11    current_app = None
     12
     13
     14    def __init__(self, *args, **kwargs):
     15        """
     16        Constructor.
     17        """
     18        for key, value in kwargs.iteritems():
     19            setattr(self, key, value)
     20
     21    def get_urls(self):
     22        """
     23        Returns the urlspatterns to be used in for the views
     24        """
     25        urlpatterns = patterns('')
     26
     27        for name, regex, cbv in self.class_based_views:
     28            urlpatterns += patterns('',
     29                url(regex, cbv.as_view(), name=name)
     30            )
     31        return urlpatterns
     32
     33    @property
     34    def urls(self):
     35        """
     36        Property to be used in the URLConf in an include method
     37        """
     38        return self.get_urls(), self.current_app
     39
     40    def get_urls_namespacestring(self):
     41        """
     42        Returns the urls prefix we should use for the url reversing
     43        """
     44        if self.current_app is not None:
     45            return '%s:' % self.current_app
     46        return ''
     47
     48
     49class CrudViewCollectionViewMixin(object):
     50    """
     51        A mixin for class based views for the CrudViewCollection
     52    """
     53    extra_context = None
     54
     55    def get_context_data(self, **kwargs):
     56        sup = super(CrudViewCollectionViewMixin, self)
     57        context = {}
     58        if hasattr(sup, 'get_context_data'):
     59            context = sup.get_context_data(**kwargs)
     60        if self.extra_context is not None:
     61            context.update(self.extra_context)
     62        return context
     63
     64class CrudListView(CrudViewCollectionViewMixin, generic.ListView):
     65    pass
     66
     67class CrudCreateView(CrudViewCollectionViewMixin, generic.CreateView):
     68    pass
     69
     70class CrudUpdateView(CrudViewCollectionViewMixin, generic.UpdateView):
     71    pass
     72
     73class CrudDeleteView(CrudViewCollectionViewMixin, generic.DeleteView):
     74    pass
     75
     76class CrudDetailView(CrudViewCollectionViewMixin, generic.DetailView):
     77    pass
     78
     79
     80class CrudViewCollection(ViewCollection):
     81    """
     82        A base crud view collection for displaying list, create, update, delete and read
     83    """
     84    templates = None
     85    model = None
     86    queryset = None
     87
     88    forms = None
     89    templates = None
     90
     91
     92    def __init__(self, *args, **kwargs):
     93        """
     94        Constructor
     95        """
     96        super(CrudViewCollection, self).__init__(*args, **kwargs)
     97        self.init_views()
     98
     99        #Make sure we have a unique current_app if not set yet
     100        if self.current_app is None:
     101            self.current_app = 'crud_%s' % (self.get_model().__class__.lower())
     102
     103
     104    def init_views(self):
     105        """
     106        Initialize the class based views
     107        """
     108        self.class_based_views = [
     109            ('list', r'^$', CrudListView.as_view(
     110                            model=self.get_model(),
     111                            queryset=self.get_queryset(),
     112                            template_name=self.get_template_for('list'),
     113            )),
     114            ('create', r'^/create/$', CrudCreateView.as_view(
     115                            model=self.get_model(),
     116                            queryset=self.get_queryset(),
     117                            form_class=self.get_form_for('create'),
     118                            template_name=self.get_template_for('create')
     119            )),
     120            ('update', r'^/update/(?P<pk>\d+)/$', CrudUpdateView.as_view(
     121                            model=self.get_model(),
     122                            queryset=self.get_queryset(),
     123                            form_class=self.get_form_for('update'),
     124                            template_name=self.get_template_for('update'),
     125            )),
     126            ('delete', r'^/delete/(?P<pk>\d+)/$', CrudDeleteView.as_view(
     127                            model=self.get_model(),
     128                            queryset=self.get_queryset(),
     129                            template_name=self.get_template_for('delete'),
     130                            success_url='%s%s' % (self.get_urls_namespacestring(), 'list'),
     131            )),
     132            ('detail', r'^/detail/(?P<pk>\d+)/$', CrudDetailView.as_view(
     133                            model=self.get_model(),
     134                            queryset=self.get_queryset(),
     135                            form_class=self.get_form_for('detail'),
     136                            template_name=self.get_template_for('detail'),
     137            )),
     138
     139        ]
     140
     141    def get_template_for(self, view_name):
     142        """
     143        Should return a template path or None
     144        """
     145        if self.templates is None:
     146            self.templates = {}
     147        return self.templates.get(view_name)
     148
     149    def get_form_for(self, view_name):
     150        """
     151        Should return the form object or None
     152        """
     153        if self.forms is None:
     154            self.forms = {}
     155        return self.forms.get(view_name)
     156
     157    def get_model(self):
     158        """
     159        Return the model or get it from the queryset
     160        """
     161        if self.model is not None:
     162            return self.model
     163        elif isinstance(self.queryset, QuerySet):
     164            return self.queryset.model
     165        raise ImproperlyConfigured('No model or queryset specified on %r' % self.__class__)
     166
     167    def get_queryset(self):
     168        """
     169            Return the queryset or get it from the model
     170        """
     171        if isinstance(self.queryset, QuerySet):
     172            return self.queryset
     173        elif self.model is not None:
     174            return self.model.objects.all()
     175        raise ImproperlyConfigured('No model or queryset specified on %r' % self.__class__)
Back to Top