class BaseDetailView
from django.views.generic.detail import BaseDetailView
A base view for displaying a single object.
Ancestors (MRO)
- BaseDetailView
- SingleObjectMixin
- ContextMixin
- View
Attributes
| Defined in | |
|---|---|
| 
                                        context_object_name = None
                                     | SingleObjectMixin | 
| 
                                        extra_context = None
                                     | ContextMixin | 
| 
                                        http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
                                     | View | 
| 
                                        model = None
                                     | SingleObjectMixin | 
| 
                                        pk_url_kwarg = 'pk'
                                     | SingleObjectMixin | 
| 
                                        query_pk_and_slug = False
                                     | SingleObjectMixin | 
| 
                                        queryset = None
                                     | SingleObjectMixin | 
| 
                                        slug_field = 'slug'
                                     | SingleObjectMixin | 
| 
                                        slug_url_kwarg = 'slug'
                                     | SingleObjectMixin | 
| 
                                        view_is_async = False
                                     | View | 
Methods
                            
                                
                                    def
                                    __init__(self, **kwargs):
                                
                                
                                    View
                                
                                ¶
                            
                        
                        
                                    def
                                    __init__(self, **kwargs):
                                
                                
                                    View
                                
                                ¶
                            Constructor. Called in the URLconf; can contain helpful extra keyword arguments, and other things.
| 52 53 54 55 56 57 58 59 60 | def __init__(self, **kwargs): """ Constructor. Called in the URLconf; can contain helpful extra keyword arguments, and other things. """ # Go through keyword arguments, and either save their values to our # instance, or raise an error. for key, value in kwargs.items(): setattr(self, key, value) | 
                            
                                
                                    def
                                    _allowed_methods(self):
                                
                                
                                    View
                                
                                ¶
                            
                        
                        
                                    def
                                    _allowed_methods(self):
                                
                                
                                    View
                                
                                ¶
                            | 168 169 | def _allowed_methods(self): return [m.upper() for m in self.http_method_names if hasattr(self, m)] | 
                            
                                
                                    def
                                    as_view(cls, **initkwargs):
                                
                                
                                    View
                                
                                ¶
                            
                        
                        
                                    def
                                    as_view(cls, **initkwargs):
                                
                                
                                    View
                                
                                ¶
                            Main entry point for a request-response process.
| 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | @classonlymethod def as_view(cls, **initkwargs): """Main entry point for a request-response process.""" for key in initkwargs: if key in cls.http_method_names: raise TypeError( "The method name %s is not accepted as a keyword argument " "to %s()." % (key, cls.__name__) ) if not hasattr(cls, key): raise TypeError( "%s() received an invalid keyword %r. as_view " "only accepts arguments that are already " "attributes of the class." % (cls.__name__, key) ) def view(request, *args, **kwargs): self = cls(**initkwargs) self.setup(request, *args, **kwargs) if not hasattr(self, "request"): raise AttributeError( "%s instance has no 'request' attribute. Did you override " "setup() and forget to call super()?" % cls.__name__ ) return self.dispatch(request, *args, **kwargs) view.view_class = cls view.view_initkwargs = initkwargs # __name__ and __qualname__ are intentionally left unchanged as # view_class should be used to robustly determine the name of the view # instead. view.__doc__ = cls.__doc__ view.__module__ = cls.__module__ view.__annotations__ = cls.dispatch.__annotations__ # Copy possible attributes set by decorators, e.g. @csrf_exempt, from # the dispatch method. view.__dict__.update(cls.dispatch.__dict__) # Mark the callback if the view class is async. if cls.view_is_async: view._is_coroutine = asyncio.coroutines._is_coroutine return view | 
                            
                                
                                    def
                                    dispatch(self, request, *args, **kwargs):
                                
                                
                                    View
                                
                                ¶
                            
                        
                        
                                    def
                                    dispatch(self, request, *args, **kwargs):
                                
                                
                                    View
                                
                                ¶
                            | 132 133 134 135 136 137 138 139 140 141 142 | def dispatch(self, request, *args, **kwargs): # Try to dispatch to the right method; if a method doesn't exist, # defer to the error handler. Also defer to the error handler if the # request method isn't on the approved list. if request.method.lower() in self.http_method_names: handler = getattr( self, request.method.lower(), self.http_method_not_allowed ) else: handler = self.http_method_not_allowed return handler(request, *args, **kwargs) | 
                            
                                
                                    def
                                    get(self, request, *args, **kwargs):
                                
                                
                                    BaseDetailView
                                
                                ¶
                            
                        
                        
                                    def
                                    get(self, request, *args, **kwargs):
                                
                                
                                    BaseDetailView
                                
                                ¶
                            | 107 108 109 110 | def get(self, request, *args, **kwargs): self.object = self.get_object() context = self.get_context_data(object=self.object) return self.render_to_response(context) | 
                            
                                
                                    def
                                    get_context_data(self, **kwargs):
                                
                                
                                ¶
                            
                        
                        
                                    def
                                    get_context_data(self, **kwargs):
                                
                                
                                ¶
                            
                                            SingleObjectMixin
                                        
                                        Insert the single object into the context dict.
| 92 93 94 95 96 97 98 99 100 101 | def get_context_data(self, **kwargs): """Insert the single object into the context dict.""" context = {} if self.object: context["object"] = self.object context_object_name = self.get_context_object_name(self.object) if context_object_name: context[context_object_name] = self.object context.update(kwargs) return super().get_context_data(**context) | 
                                            ContextMixin
                                        
                                        | 28 29 30 31 32 | def get_context_data(self, **kwargs): kwargs.setdefault("view", self) if self.extra_context is not None: kwargs.update(self.extra_context) return kwargs | 
                            
                                
                                    def
                                    get_context_object_name(self, obj):
                                
                                
                                    SingleObjectMixin
                                
                                ¶
                            
                        
                        
                                    def
                                    get_context_object_name(self, obj):
                                
                                
                                    SingleObjectMixin
                                
                                ¶
                            Get the name to use for the object.
| 83 84 85 86 87 88 89 90 | def get_context_object_name(self, obj): """Get the name to use for the object.""" if self.context_object_name: return self.context_object_name elif isinstance(obj, models.Model): return obj._meta.model_name else: return None | 
                            
                                
                                    def
                                    get_object(self, queryset=None):
                                
                                
                                    SingleObjectMixin
                                
                                ¶
                            
                        
                        
                                    def
                                    get_object(self, queryset=None):
                                
                                
                                    SingleObjectMixin
                                
                                ¶
                            Return the object the view is displaying. Require `self.queryset` and a `pk` or `slug` argument in the URLconf. Subclasses can override this to return any object.
| 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | def get_object(self, queryset=None): """ Return the object the view is displaying. Require `self.queryset` and a `pk` or `slug` argument in the URLconf. Subclasses can override this to return any object. """ # Use a custom queryset if provided; this is required for subclasses # like DateDetailView if queryset is None: queryset = self.get_queryset() # Next, try looking up by primary key. pk = self.kwargs.get(self.pk_url_kwarg) slug = self.kwargs.get(self.slug_url_kwarg) if pk is not None: queryset = queryset.filter(pk=pk) # Next, try looking up by slug. if slug is not None and (pk is None or self.query_pk_and_slug): slug_field = self.get_slug_field() queryset = queryset.filter(**{slug_field: slug}) # If none of those are defined, it's an error. if pk is None and slug is None: raise AttributeError( "Generic detail view %s must be called with either an object " "pk or a slug in the URLconf." % self.__class__.__name__ ) try: # Get the single item from the filtered queryset obj = queryset.get() except queryset.model.DoesNotExist: raise Http404( _("No %(verbose_name)s found matching the query") % {"verbose_name": queryset.model._meta.verbose_name} ) return obj | 
                            
                                
                                    def
                                    get_queryset(self):
                                
                                
                                    SingleObjectMixin
                                
                                ¶
                            
                        
                        
                                    def
                                    get_queryset(self):
                                
                                
                                    SingleObjectMixin
                                
                                ¶
                            Return the `QuerySet` that will be used to look up the object. This method is called by the default implementation of get_object() and may not be called if get_object() is overridden.
| 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | def get_queryset(self): """ Return the `QuerySet` that will be used to look up the object. This method is called by the default implementation of get_object() and may not be called if get_object() is overridden. """ if self.queryset is None: if self.model: return self.model._default_manager.all() else: raise ImproperlyConfigured( "%(cls)s is missing a QuerySet. Define " "%(cls)s.model, %(cls)s.queryset, or override " "%(cls)s.get_queryset()." % {"cls": self.__class__.__name__} ) return self.queryset.all() | 
                            
                                
                                    def
                                    get_slug_field(self):
                                
                                
                                    SingleObjectMixin
                                
                                ¶
                            
                        
                        
                                    def
                                    get_slug_field(self):
                                
                                
                                    SingleObjectMixin
                                
                                ¶
                            Get the name of a slug field to be used to look up by slug.
| 79 80 81 | def get_slug_field(self): """Get the name of a slug field to be used to look up by slug.""" return self.slug_field | 
                            
                                
                                    def
                                    http_method_not_allowed(self, request, *args, **kwargs):
                                
                                
                                    View
                                
                                ¶
                            
                        
                        
                                    def
                                    http_method_not_allowed(self, request, *args, **kwargs):
                                
                                
                                    View
                                
                                ¶
                            | 144 145 146 147 148 149 150 151 | def http_method_not_allowed(self, request, *args, **kwargs): logger.warning( "Method Not Allowed (%s): %s", request.method, request.path, extra={"status_code": 405, "request": request}, ) return HttpResponseNotAllowed(self._allowed_methods()) | 
                            
                                
                                    def
                                    options(self, request, *args, **kwargs):
                                
                                
                                    View
                                
                                ¶
                            
                        
                        
                                    def
                                    options(self, request, *args, **kwargs):
                                
                                
                                    View
                                
                                ¶
                            Handle responding to requests for the OPTIONS HTTP verb.
| 153 154 155 156 157 158 159 160 161 162 163 | def options(self, request, *args, **kwargs): """Handle responding to requests for the OPTIONS HTTP verb.""" response = HttpResponse() response.headers["Allow"] = ", ".join(self._allowed_methods()) response.headers["Content-Length"] = "0" if self.view_is_async: async def func(): return response return func() else: return response | 
                            
                                
                                    def
                                    setup(self, request, *args, **kwargs):
                                
                                
                                    View
                                
                                ¶
                            
                        
                        
                                    def
                                    setup(self, request, *args, **kwargs):
                                
                                
                                    View
                                
                                ¶
                            Initialize attributes shared by all view methods.
| 124 125 126 127 128 129 130 | def setup(self, request, *args, **kwargs): """Initialize attributes shared by all view methods.""" if hasattr(self, "get") and not hasattr(self, "head"): self.head = self.get self.request = request self.args = args self.kwargs = kwargs |