class UpdateView
from django.views.generic import UpdateView
View for updating an object, with a response rendered by template..
Ancestors (MRO)
Attributes
| Defined in | |
|---|---|
context_object_name = None
|
SingleObjectMixin |
form_class = None
|
FormMixin |
http_method_names = ['get', 'post', 'put', 'delete', 'head', 'options', 'trace']
|
View |
initial = {}
|
FormMixin |
model = None
|
SingleObjectMixin |
pk_url_kwarg = 'pk'
|
SingleObjectMixin |
queryset = None
|
SingleObjectMixin |
response_class = <class 'django.template.response.TemplateResponse'>
|
TemplateResponseMixin |
slug_field = 'slug'
|
SingleObjectMixin |
slug_url_kwarg = 'slug'
|
SingleObjectMixin |
success_url = None
|
FormMixin |
template_name = None
|
TemplateResponseMixin |
template_name_field = None
|
SingleObjectTemplateResponseMixin |
template_name_suffix = '_detail'
|
SingleObjectTemplateResponseMixin |
template_name_suffix = '_form'
|
UpdateView |
Methods
def
as_view(cls, **initkwargs):
View
Main entry point for a request-response process.
- @classonlymethod
- def as_view(cls, **initkwargs):
- """
- Main entry point for a request-response process.
- """
- # sanitize keyword arguments
- for key in initkwargs:
- if key in cls.http_method_names:
- raise TypeError(u"You tried to pass in the %s method name as a "
- u"keyword argument to %s(). Don't do that."
- % (key, cls.__name__))
- if not hasattr(cls, key):
- raise TypeError(u"%s() received an invalid keyword %r" % (
- cls.__name__, key))
- def view(request, *args, **kwargs):
- self = cls(**initkwargs)
- if hasattr(self, 'get') and not hasattr(self, 'head'):
- self.head = self.get
- return self.dispatch(request, *args, **kwargs)
- # take name and docstring from class
- update_wrapper(view, cls, updated=())
- # and possible attributes set by decorators
- # like csrf_exempt from dispatch
- update_wrapper(view, cls.dispatch, assigned=())
- return view
def
dispatch(self, request, *args, **kwargs):
View
- 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
- self.request = request
- self.args = args
- self.kwargs = kwargs
- return handler(request, *args, **kwargs)
def
form_invalid(self, form):
FormMixin
- def form_invalid(self, form):
- return self.render_to_response(self.get_context_data(form=form))
def
form_valid(self, form):
ModelFormMixin
- def form_valid(self, form):
- self.object = form.save()
- return super(ModelFormMixin, self).form_valid(form)
FormMixin
- def form_valid(self, form):
- return HttpResponseRedirect(self.get_success_url())
def
get(self, request, *args, **kwargs):
BaseUpdateView
- def get(self, request, *args, **kwargs):
- self.object = self.get_object()
- return super(BaseUpdateView, self).get(request, *args, **kwargs)
ProcessFormView
- def get(self, request, *args, **kwargs):
- form_class = self.get_form_class()
- form = self.get_form(form_class)
- return self.render_to_response(self.get_context_data(form=form))
def
get_context_data(self, **kwargs):
ModelFormMixin
- def get_context_data(self, **kwargs):
- context = kwargs
- 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
- return context
FormMixin
- def get_context_data(self, **kwargs):
- return kwargs
SingleObjectMixin
- def get_context_data(self, **kwargs):
- context = kwargs
- context_object_name = self.get_context_object_name(self.object)
- if context_object_name:
- context[context_object_name] = self.object
- return context
def
get_context_object_name(self, obj):
SingleObjectMixin
Get the name to use for the object.
- 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 hasattr(obj, '_meta'):
- return smart_str(obj._meta.object_name.lower())
- else:
- return None
def
get_form(self, form_class):
FormMixin
Returns an instance of the form to be used in this view.
- def get_form(self, form_class):
- """
- Returns an instance of the form to be used in this view.
- """
- return form_class(**self.get_form_kwargs())
def
get_form_class(self):
ModelFormMixin
Returns the form class to use in this view
- def get_form_class(self):
- """
- Returns the form class to use in this view
- """
- if self.form_class:
- return self.form_class
- else:
- if self.model is not None:
- # If a model has been explicitly provided, use it
- model = self.model
- elif hasattr(self, 'object') and self.object is not None:
- # If this view is operating on a single object, use
- # the class of that object
- model = self.object.__class__
- else:
- # Try to get a queryset and extract the model class
- # from that
- model = self.get_queryset().model
- return model_forms.modelform_factory(model)
FormMixin
Returns the form class to use in this view
- def get_form_class(self):
- """
- Returns the form class to use in this view
- """
- return self.form_class
def
get_form_kwargs(self):
ModelFormMixin
Returns the keyword arguments for instanciating the form.
- def get_form_kwargs(self):
- """
- Returns the keyword arguments for instanciating the form.
- """
- kwargs = super(ModelFormMixin, self).get_form_kwargs()
- kwargs.update({'instance': self.object})
- return kwargs
FormMixin
Returns the keyword arguments for instanciating the form.
- def get_form_kwargs(self):
- """
- Returns the keyword arguments for instanciating the form.
- """
- kwargs = {'initial': self.get_initial()}
- if self.request.method in ('POST', 'PUT'):
- kwargs.update({
- 'data': self.request.POST,
- 'files': self.request.FILES,
- })
- return kwargs
def
get_initial(self):
FormMixin
Returns the initial data to use for forms on this view.
- def get_initial(self):
- """
- Returns the initial data to use for forms on this view.
- """
- return self.initial.copy()
def
get_object(self, queryset=None):
SingleObjectMixin
Returns the object the view is displaying. By default this requires `self.queryset` and a `pk` or `slug` argument in the URLconf, but subclasses can override this to return any object.
- def get_object(self, queryset=None):
- """
- Returns the object the view is displaying.
- By default this requires `self.queryset` and a `pk` or `slug` argument
- in the URLconf, but 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, None)
- slug = self.kwargs.get(self.slug_url_kwarg, None)
- if pk is not None:
- queryset = queryset.filter(pk=pk)
- # Next, try looking up by slug.
- elif slug is not None:
- slug_field = self.get_slug_field()
- queryset = queryset.filter(**{slug_field: slug})
- # If none of those are defined, it's an error.
- else:
- raise AttributeError(u"Generic detail view %s must be called with "
- u"either an object pk or a slug."
- % self.__class__.__name__)
- try:
- obj = queryset.get()
- except ObjectDoesNotExist:
- raise Http404(_(u"No %(verbose_name)s found matching the query") %
- {'verbose_name': queryset.model._meta.verbose_name})
- return obj
def
get_queryset(self):
SingleObjectMixin
Get the queryset to look an object up against. May not be called if `get_object` is overridden.
- def get_queryset(self):
- """
- Get the queryset to look an object up against. 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(u"%(cls)s is missing a queryset. Define "
- u"%(cls)s.model, %(cls)s.queryset, or override "
- u"%(cls)s.get_object()." % {
- 'cls': self.__class__.__name__
- })
- return self.queryset._clone()
def
get_slug_field(self):
SingleObjectMixin
Get the name of a slug field to be used to look up by slug.
- 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
get_success_url(self):
ModelFormMixin
- def get_success_url(self):
- if self.success_url:
- url = self.success_url % self.object.__dict__
- else:
- try:
- url = self.object.get_absolute_url()
- except AttributeError:
- raise ImproperlyConfigured(
- "No URL to redirect to. Either provide a url or define"
- " a get_absolute_url method on the Model.")
- return url
FormMixin
- def get_success_url(self):
- if self.success_url:
- url = self.success_url
- else:
- raise ImproperlyConfigured(
- "No URL to redirect to. Provide a success_url.")
- return url
def
get_template_names(self):
SingleObjectTemplateResponseMixin
Return a list of template names to be used for the request. Must return a list. May not be called if get_template is overridden.
- def get_template_names(self):
- """
- Return a list of template names to be used for the request. Must return
- a list. May not be called if get_template is overridden.
- """
- try:
- names = super(SingleObjectTemplateResponseMixin, self).get_template_names()
- except ImproperlyConfigured:
- # If template_name isn't specified, it's not a problem --
- # we just start with an empty list.
- names = []
- # If self.template_name_field is set, grab the value of the field
- # of that name from the object; this is the most specific template
- # name, if given.
- if self.object and self.template_name_field:
- name = getattr(self.object, self.template_name_field, None)
- if name:
- names.insert(0, name)
- # The least-specific option is the default <app>/<model>_detail.html;
- # only use this if the object in question is a model.
- if hasattr(self.object, '_meta'):
- names.append("%s/%s%s.html" % (
- self.object._meta.app_label,
- self.object._meta.object_name.lower(),
- self.template_name_suffix
- ))
- elif hasattr(self, 'model') and hasattr(self.model, '_meta'):
- names.append("%s/%s%s.html" % (
- self.model._meta.app_label,
- self.model._meta.object_name.lower(),
- self.template_name_suffix
- ))
- return names
TemplateResponseMixin
Returns 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.
- def get_template_names(self):
- """
- Returns 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.
- """
- if self.template_name is None:
- raise ImproperlyConfigured(
- "TemplateResponseMixin requires either a definition of "
- "'template_name' or an implementation of 'get_template_names()'")
- else:
- return [self.template_name]
def
http_method_not_allowed(self, request, *args, **kwargs):
View
- def http_method_not_allowed(self, request, *args, **kwargs):
- allowed_methods = [m for m in self.http_method_names if hasattr(self, m)]
- logger.warning('Method Not Allowed (%s): %s', request.method, request.path,
- extra={
- 'status_code': 405,
- 'request': self.request
- }
- )
- return http.HttpResponseNotAllowed(allowed_methods)
def
__init__(self, **kwargs):
View
Constructor. Called in the URLconf; can contain helpful extra keyword arguments, and other things.
- 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.iteritems():
- setattr(self, key, value)
def
post(self, request, *args, **kwargs):
BaseUpdateView
- def post(self, request, *args, **kwargs):
- self.object = self.get_object()
- return super(BaseUpdateView, self).post(request, *args, **kwargs)
ProcessFormView
- def post(self, request, *args, **kwargs):
- form_class = self.get_form_class()
- form = self.get_form(form_class)
- if form.is_valid():
- return self.form_valid(form)
- else:
- return self.form_invalid(form)
def
put(self, *args, **kwargs):
ProcessFormView
- def put(self, *args, **kwargs):
- return self.post(*args, **kwargs)
def
render_to_response(self, context, **response_kwargs):
TemplateResponseMixin
Returns a response with a template rendered with the given context.
- def render_to_response(self, context, **response_kwargs):
- """
- Returns a response with a template rendered with the given context.
- """
- return self.response_class(
- request = self.request,
- template = self.get_template_names(),
- context = context,
- **response_kwargs
- )