Constructor. Called in the URLconf; can contain helpful extra
keyword arguments, and other things.
38
39
40
41
42
43
44
45
46
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.forkey,valueinkwargs.items():setattr(self,key,value)
@classonlymethoddefas_view(cls,**initkwargs):"""Main entry point for a request-response process."""forkeyininitkwargs:ifkeyincls.http_method_names:raiseTypeError("You tried to pass in the %s method name as a ""keyword argument to %s(). Don't do that."%(key,cls.__name__))ifnothasattr(cls,key):raiseTypeError("%s() received an invalid keyword %r. as_view ""only accepts arguments that are already ""attributes of the class."%(cls.__name__,key))defview(request,*args,**kwargs):self=cls(**initkwargs)ifhasattr(self,'get')andnothasattr(self,'head'):self.head=self.getself.setup(request,*args,**kwargs)ifnothasattr(self,'request'):raiseAttributeError("%s instance has no 'request' attribute. Did you override ""setup() and forget to call super()?"%cls.__name__)returnself.dispatch(request,*args,**kwargs)view.view_class=clsview.view_initkwargs=initkwargs# take name and docstring from classupdate_wrapper(view,cls,updated=())# and possible attributes set by decorators# like csrf_exempt from dispatchupdate_wrapper(view,cls.dispatch,assigned=())returnview
defdispatch(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.ifrequest.method.lower()inself.http_method_names:handler=getattr(self,request.method.lower(),self.http_method_not_allowed)else:handler=self.http_method_not_allowedreturnhandler(request,*args,**kwargs)
If the form is invalid, render the invalid form.
59
60
61
defform_invalid(self,form):"""If the form is invalid, render the invalid form."""returnself.render_to_response(self.get_context_data(form=form))
PasswordChangeView
If the form is valid, redirect to the supplied URL.
345
346
347
348
349
350
defform_valid(self,form):form.save()# Updating the password logs out all other sessions for the user# except the current one.update_session_auth_hash(self.request,form.user)returnsuper().form_valid(form)
FormMixin
If the form is valid, redirect to the supplied URL.
55
56
57
defform_valid(self,form):"""If the form is valid, redirect to the supplied URL."""returnHttpResponseRedirect(self.get_success_url())
Handle GET requests: instantiate a blank version of the form.
131
132
133
defget(self,request,*args,**kwargs):"""Handle GET requests: instantiate a blank version of the form."""returnself.render_to_response(self.get_context_data())
defget_context_data(self,**kwargs):"""Insert the form into the context dict."""if'form'notinkwargs:kwargs['form']=self.get_form()returnsuper().get_context_data(**kwargs)
Return an instance of the form to be used in this view.
29
30
31
32
33
defget_form(self,form_class=None):"""Return an instance of the form to be used in this view."""ifform_classisNone:form_class=self.get_form_class()returnform_class(**self.get_form_kwargs())
Return the form class to use.
25
26
27
defget_form_class(self):"""Return the form class to use."""returnself.form_class
PasswordChangeView
Return the keyword arguments for instantiating the form.
Return the keyword arguments for instantiating the form.
35
36
37
38
39
40
41
42
43
44
45
46
defget_form_kwargs(self):"""Return the keyword arguments for instantiating the form."""kwargs={'initial':self.get_initial(),'prefix':self.get_prefix(),}ifself.request.methodin('POST','PUT'):kwargs.update({'data':self.request.POST,'files':self.request.FILES,})returnkwargs
Return the initial data to use for forms on this view.
17
18
19
defget_initial(self):"""Return the initial data to use for forms on this view."""returnself.initial.copy()
Return the prefix to use for forms.
21
22
23
defget_prefix(self):"""Return the prefix to use for forms."""returnself.prefix
Return the URL to redirect to after processing a valid form.
49
50
51
52
53
defget_success_url(self):"""Return the URL to redirect to after processing a valid form."""ifnotself.success_url:raiseImproperlyConfigured("No URL to redirect to. Provide a success_url.")returnstr(self.success_url)# success_url may be lazy
Return a list of template names to be used for the request. Must return
a list. May not be called if render_to_response() is overridden.
140
141
142
143
144
145
146
147
148
149
150
defget_template_names(self):""" Return a list of template names to be used for the request. Must return a list. May not be called if render_to_response() is overridden. """ifself.template_nameisNone:raiseImproperlyConfigured("TemplateResponseMixin requires either a definition of ""'template_name' or an implementation of 'get_template_names()'")else:return[self.template_name]
99
100
101
102
103
104
defhttp_method_not_allowed(self,request,*args,**kwargs):logger.warning('Method Not Allowed (%s): %s',request.method,request.path,extra={'status_code':405,'request':request})returnHttpResponseNotAllowed(self._allowed_methods())
Handle responding to requests for the OPTIONS HTTP verb.
106
107
108
109
110
111
defoptions(self,request,*args,**kwargs):"""Handle responding to requests for the OPTIONS HTTP verb."""response=HttpResponse()response['Allow']=', '.join(self._allowed_methods())response['Content-Length']='0'returnresponse
Handle POST requests: instantiate a form instance with the passed
POST variables and then check if it's valid.
135
136
137
138
139
140
141
142
143
144
defpost(self,request,*args,**kwargs):""" Handle POST requests: instantiate a form instance with the passed POST variables and then check if it's valid. """form=self.get_form()ifform.is_valid():returnself.form_valid(form)else:returnself.form_invalid(form)
Return a response, using the `response_class` for this view, with a template rendered with the given context. Pass response_kwargs to the constructor of the response class.
defrender_to_response(self,context,**response_kwargs):""" Return a response, using the `response_class` for this view, with a template rendered with the given context. Pass response_kwargs to the constructor of the response class. """response_kwargs.setdefault('content_type',self.content_type)returnself.response_class(request=self.request,template=self.get_template_names(),context=context,using=self.template_engine,**response_kwargs)
Initialize attributes shared by all view methods.
83
84
85
86
87
defsetup(self,request,*args,**kwargs):"""Initialize attributes shared by all view methods."""self.request=requestself.args=argsself.kwargs=kwargs