class UpdateView

from django.views.generic import UpdateView
View for updating an object,
with a response rendered by template..

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
Expand Collapse

Methods

def as_view(cls, **initkwargs): View

Main entry point for a request-response process.
  1. @classonlymethod
  2. def as_view(cls, **initkwargs):
  3. """
  4. Main entry point for a request-response process.
  5. """
  6. # sanitize keyword arguments
  7. for key in initkwargs:
  8. if key in cls.http_method_names:
  9. raise TypeError(u"You tried to pass in the %s method name as a "
  10. u"keyword argument to %s(). Don't do that."
  11. % (key, cls.__name__))
  12. if not hasattr(cls, key):
  13. raise TypeError(u"%s() received an invalid keyword %r" % (
  14. cls.__name__, key))
  15. def view(request, *args, **kwargs):
  16. self = cls(**initkwargs)
  17. if hasattr(self, 'get') and not hasattr(self, 'head'):
  18. self.head = self.get
  19. return self.dispatch(request, *args, **kwargs)
  20. # take name and docstring from class
  21. update_wrapper(view, cls, updated=())
  22. # and possible attributes set by decorators
  23. # like csrf_exempt from dispatch
  24. update_wrapper(view, cls.dispatch, assigned=())
  25. return view

def dispatch(self, request, *args, **kwargs): View

  1. def dispatch(self, request, *args, **kwargs):
  2. # Try to dispatch to the right method; if a method doesn't exist,
  3. # defer to the error handler. Also defer to the error handler if the
  4. # request method isn't on the approved list.
  5. if request.method.lower() in self.http_method_names:
  6. handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
  7. else:
  8. handler = self.http_method_not_allowed
  9. self.request = request
  10. self.args = args
  11. self.kwargs = kwargs
  12. return handler(request, *args, **kwargs)

def form_invalid(self, form): FormMixin

  1. def form_invalid(self, form):
  2. return self.render_to_response(self.get_context_data(form=form))

def form_valid(self, form):

ModelFormMixin

  1. def form_valid(self, form):
  2. self.object = form.save()
  3. return super(ModelFormMixin, self).form_valid(form)

FormMixin

  1. def form_valid(self, form):
  2. return HttpResponseRedirect(self.get_success_url())

def get(self, request, *args, **kwargs):

BaseUpdateView

  1. def get(self, request, *args, **kwargs):
  2. self.object = self.get_object()
  3. return super(BaseUpdateView, self).get(request, *args, **kwargs)

ProcessFormView

  1. def get(self, request, *args, **kwargs):
  2. form_class = self.get_form_class()
  3. form = self.get_form(form_class)
  4. return self.render_to_response(self.get_context_data(form=form))

def get_context_data(self, **kwargs):

ModelFormMixin

  1. def get_context_data(self, **kwargs):
  2. context = kwargs
  3. if self.object:
  4. context['object'] = self.object
  5. context_object_name = self.get_context_object_name(self.object)
  6. if context_object_name:
  7. context[context_object_name] = self.object
  8. return context

FormMixin

  1. def get_context_data(self, **kwargs):
  2. return kwargs

SingleObjectMixin

  1. def get_context_data(self, **kwargs):
  2. context = kwargs
  3. context_object_name = self.get_context_object_name(self.object)
  4. if context_object_name:
  5. context[context_object_name] = self.object
  6. return context

def get_context_object_name(self, obj): SingleObjectMixin

Get the name to use for the object.
  1. def get_context_object_name(self, obj):
  2. """
  3. Get the name to use for the object.
  4. """
  5. if self.context_object_name:
  6. return self.context_object_name
  7. elif hasattr(obj, '_meta'):
  8. return smart_str(obj._meta.object_name.lower())
  9. else:
  10. return None

def get_form(self, form_class): FormMixin

Returns an instance of the form to be used in this view.
  1. def get_form(self, form_class):
  2. """
  3. Returns an instance of the form to be used in this view.
  4. """
  5. return form_class(**self.get_form_kwargs())

def get_form_class(self):

ModelFormMixin

Returns the form class to use in this view
  1. def get_form_class(self):
  2. """
  3. Returns the form class to use in this view
  4. """
  5. if self.form_class:
  6. return self.form_class
  7. else:
  8. if self.model is not None:
  9. # If a model has been explicitly provided, use it
  10. model = self.model
  11. elif hasattr(self, 'object') and self.object is not None:
  12. # If this view is operating on a single object, use
  13. # the class of that object
  14. model = self.object.__class__
  15. else:
  16. # Try to get a queryset and extract the model class
  17. # from that
  18. model = self.get_queryset().model
  19. return model_forms.modelform_factory(model)

FormMixin

Returns the form class to use in this view
  1. def get_form_class(self):
  2. """
  3. Returns the form class to use in this view
  4. """
  5. return self.form_class

def get_form_kwargs(self):

ModelFormMixin

Returns the keyword arguments for instanciating the form.
  1. def get_form_kwargs(self):
  2. """
  3. Returns the keyword arguments for instanciating the form.
  4. """
  5. kwargs = super(ModelFormMixin, self).get_form_kwargs()
  6. kwargs.update({'instance': self.object})
  7. return kwargs

FormMixin

Returns the keyword arguments for instanciating the form.
  1. def get_form_kwargs(self):
  2. """
  3. Returns the keyword arguments for instanciating the form.
  4. """
  5. kwargs = {'initial': self.get_initial()}
  6. if self.request.method in ('POST', 'PUT'):
  7. kwargs.update({
  8. 'data': self.request.POST,
  9. 'files': self.request.FILES,
  10. })
  11. return kwargs

def get_initial(self): FormMixin

Returns the initial data to use for forms on this view.
  1. def get_initial(self):
  2. """
  3. Returns the initial data to use for forms on this view.
  4. """
  5. 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.
  1. def get_object(self, queryset=None):
  2. """
  3. Returns the object the view is displaying.
  4. By default this requires `self.queryset` and a `pk` or `slug` argument
  5. in the URLconf, but subclasses can override this to return any object.
  6. """
  7. # Use a custom queryset if provided; this is required for subclasses
  8. # like DateDetailView
  9. if queryset is None:
  10. queryset = self.get_queryset()
  11. # Next, try looking up by primary key.
  12. pk = self.kwargs.get(self.pk_url_kwarg, None)
  13. slug = self.kwargs.get(self.slug_url_kwarg, None)
  14. if pk is not None:
  15. queryset = queryset.filter(pk=pk)
  16. # Next, try looking up by slug.
  17. elif slug is not None:
  18. slug_field = self.get_slug_field()
  19. queryset = queryset.filter(**{slug_field: slug})
  20. # If none of those are defined, it's an error.
  21. else:
  22. raise AttributeError(u"Generic detail view %s must be called with "
  23. u"either an object pk or a slug."
  24. % self.__class__.__name__)
  25. try:
  26. obj = queryset.get()
  27. except ObjectDoesNotExist:
  28. raise Http404(_(u"No %(verbose_name)s found matching the query") %
  29. {'verbose_name': queryset.model._meta.verbose_name})
  30. 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.
  1. def get_queryset(self):
  2. """
  3. Get the queryset to look an object up against. May not be called if
  4. `get_object` is overridden.
  5. """
  6. if self.queryset is None:
  7. if self.model:
  8. return self.model._default_manager.all()
  9. else:
  10. raise ImproperlyConfigured(u"%(cls)s is missing a queryset. Define "
  11. u"%(cls)s.model, %(cls)s.queryset, or override "
  12. u"%(cls)s.get_object()." % {
  13. 'cls': self.__class__.__name__
  14. })
  15. 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.
  1. def get_slug_field(self):
  2. """
  3. Get the name of a slug field to be used to look up by slug.
  4. """
  5. return self.slug_field

def get_success_url(self):

ModelFormMixin

  1. def get_success_url(self):
  2. if self.success_url:
  3. url = self.success_url % self.object.__dict__
  4. else:
  5. try:
  6. url = self.object.get_absolute_url()
  7. except AttributeError:
  8. raise ImproperlyConfigured(
  9. "No URL to redirect to. Either provide a url or define"
  10. " a get_absolute_url method on the Model.")
  11. return url

FormMixin

  1. def get_success_url(self):
  2. if self.success_url:
  3. url = self.success_url
  4. else:
  5. raise ImproperlyConfigured(
  6. "No URL to redirect to. Provide a success_url.")
  7. 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.
  1. def get_template_names(self):
  2. """
  3. Return a list of template names to be used for the request. Must return
  4. a list. May not be called if get_template is overridden.
  5. """
  6. try:
  7. names = super(SingleObjectTemplateResponseMixin, self).get_template_names()
  8. except ImproperlyConfigured:
  9. # If template_name isn't specified, it's not a problem --
  10. # we just start with an empty list.
  11. names = []
  12. # If self.template_name_field is set, grab the value of the field
  13. # of that name from the object; this is the most specific template
  14. # name, if given.
  15. if self.object and self.template_name_field:
  16. name = getattr(self.object, self.template_name_field, None)
  17. if name:
  18. names.insert(0, name)
  19. # The least-specific option is the default <app>/<model>_detail.html;
  20. # only use this if the object in question is a model.
  21. if hasattr(self.object, '_meta'):
  22. names.append("%s/%s%s.html" % (
  23. self.object._meta.app_label,
  24. self.object._meta.object_name.lower(),
  25. self.template_name_suffix
  26. ))
  27. elif hasattr(self, 'model') and hasattr(self.model, '_meta'):
  28. names.append("%s/%s%s.html" % (
  29. self.model._meta.app_label,
  30. self.model._meta.object_name.lower(),
  31. self.template_name_suffix
  32. ))
  33. 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.
  1. def get_template_names(self):
  2. """
  3. Returns a list of template names to be used for the request. Must return
  4. a list. May not be called if render_to_response is overridden.
  5. """
  6. if self.template_name is None:
  7. raise ImproperlyConfigured(
  8. "TemplateResponseMixin requires either a definition of "
  9. "'template_name' or an implementation of 'get_template_names()'")
  10. else:
  11. return [self.template_name]

def http_method_not_allowed(self, request, *args, **kwargs): View

  1. def http_method_not_allowed(self, request, *args, **kwargs):
  2. allowed_methods = [m for m in self.http_method_names if hasattr(self, m)]
  3. logger.warning('Method Not Allowed (%s): %s', request.method, request.path,
  4. extra={
  5. 'status_code': 405,
  6. 'request': self.request
  7. }
  8. )
  9. return http.HttpResponseNotAllowed(allowed_methods)

def __init__(self, **kwargs): View

Constructor. Called in the URLconf; can contain helpful extra
keyword arguments, and other things.
  1. def __init__(self, **kwargs):
  2. """
  3. Constructor. Called in the URLconf; can contain helpful extra
  4. keyword arguments, and other things.
  5. """
  6. # Go through keyword arguments, and either save their values to our
  7. # instance, or raise an error.
  8. for key, value in kwargs.iteritems():
  9. setattr(self, key, value)

def post(self, request, *args, **kwargs):

BaseUpdateView

  1. def post(self, request, *args, **kwargs):
  2. self.object = self.get_object()
  3. return super(BaseUpdateView, self).post(request, *args, **kwargs)

ProcessFormView

  1. def post(self, request, *args, **kwargs):
  2. form_class = self.get_form_class()
  3. form = self.get_form(form_class)
  4. if form.is_valid():
  5. return self.form_valid(form)
  6. else:
  7. return self.form_invalid(form)

def put(self, *args, **kwargs): ProcessFormView

  1. def put(self, *args, **kwargs):
  2. 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.
  1. def render_to_response(self, context, **response_kwargs):
  2. """
  3. Returns a response with a template rendered with the given context.
  4. """
  5. return self.response_class(
  6. request = self.request,
  7. template = self.get_template_names(),
  8. context = context,
  9. **response_kwargs
  10. )