summaryrefslogtreecommitdiff
path: root/django/views
diff options
context:
space:
mode:
authorClaude Paroz <claude@2xlibre.net>2012-04-25 19:17:47 +0000
committerClaude Paroz <claude@2xlibre.net>2012-04-25 19:17:47 +0000
commit1858e476721890ce1f47dfa4d2739d9e0f11621b (patch)
treef8476bdf1de3cff6217ed4c77428eca3ef86db78 /django/views
parentea9dc9f4b03ae034c1dc080730422dda7a9c2e47 (diff)
Fixed #18033 -- Removed function-based generic views, as per official deprecation timeline. Rest in peace! Thanks Anssi Kääriäinen for the review.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@17937 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django/views')
-rw-r--r--django/views/generic/create_update.py221
-rw-r--r--django/views/generic/date_based.py376
-rw-r--r--django/views/generic/list_detail.py152
-rw-r--r--django/views/generic/simple.py68
4 files changed, 0 insertions, 817 deletions
diff --git a/django/views/generic/create_update.py b/django/views/generic/create_update.py
deleted file mode 100644
index 59760b4572..0000000000
--- a/django/views/generic/create_update.py
+++ /dev/null
@@ -1,221 +0,0 @@
-from django.forms.models import ModelFormMetaclass, ModelForm
-from django.template import RequestContext, loader
-from django.http import Http404, HttpResponse, HttpResponseRedirect
-from django.core.xheaders import populate_xheaders
-from django.core.exceptions import ObjectDoesNotExist, ImproperlyConfigured
-from django.utils.translation import ugettext
-from django.contrib.auth.views import redirect_to_login
-from django.views.generic import GenericViewError
-from django.contrib import messages
-
-import warnings
-warnings.warn(
- 'Function-based generic views have been deprecated; use class-based views instead.',
- DeprecationWarning
-)
-
-
-def apply_extra_context(extra_context, context):
- """
- Adds items from extra_context dict to context. If a value in extra_context
- is callable, then it is called and the result is added to context.
- """
- for key, value in extra_context.iteritems():
- if callable(value):
- context[key] = value()
- else:
- context[key] = value
-
-def get_model_and_form_class(model, form_class):
- """
- Returns a model and form class based on the model and form_class
- parameters that were passed to the generic view.
-
- If ``form_class`` is given then its associated model will be returned along
- with ``form_class`` itself. Otherwise, if ``model`` is given, ``model``
- itself will be returned along with a ``ModelForm`` class created from
- ``model``.
- """
- if form_class:
- return form_class._meta.model, form_class
- if model:
- # The inner Meta class fails if model = model is used for some reason.
- tmp_model = model
- # TODO: we should be able to construct a ModelForm without creating
- # and passing in a temporary inner class.
- class Meta:
- model = tmp_model
- class_name = model.__name__ + 'Form'
- form_class = ModelFormMetaclass(class_name, (ModelForm,), {'Meta': Meta})
- return model, form_class
- raise GenericViewError("Generic view must be called with either a model or"
- " form_class argument.")
-
-def redirect(post_save_redirect, obj):
- """
- Returns a HttpResponseRedirect to ``post_save_redirect``.
-
- ``post_save_redirect`` should be a string, and can contain named string-
- substitution place holders of ``obj`` field names.
-
- If ``post_save_redirect`` is None, then redirect to ``obj``'s URL returned
- by ``get_absolute_url()``. If ``obj`` has no ``get_absolute_url`` method,
- then raise ImproperlyConfigured.
-
- This function is meant to handle the post_save_redirect parameter to the
- ``create_object`` and ``update_object`` views.
- """
- if post_save_redirect:
- return HttpResponseRedirect(post_save_redirect % obj.__dict__)
- elif hasattr(obj, 'get_absolute_url'):
- return HttpResponseRedirect(obj.get_absolute_url())
- else:
- raise ImproperlyConfigured(
- "No URL to redirect to. Either pass a post_save_redirect"
- " parameter to the generic view or define a get_absolute_url"
- " method on the Model.")
-
-def lookup_object(model, object_id, slug, slug_field):
- """
- Return the ``model`` object with the passed ``object_id``. If
- ``object_id`` is None, then return the object whose ``slug_field``
- equals the passed ``slug``. If ``slug`` and ``slug_field`` are not passed,
- then raise Http404 exception.
- """
- lookup_kwargs = {}
- if object_id:
- lookup_kwargs['%s__exact' % model._meta.pk.name] = object_id
- elif slug and slug_field:
- lookup_kwargs['%s__exact' % slug_field] = slug
- else:
- raise GenericViewError(
- "Generic view must be called with either an object_id or a"
- " slug/slug_field.")
- try:
- return model.objects.get(**lookup_kwargs)
- except ObjectDoesNotExist:
- raise Http404("No %s found for %s"
- % (model._meta.verbose_name, lookup_kwargs))
-
-def create_object(request, model=None, template_name=None,
- template_loader=loader, extra_context=None, post_save_redirect=None,
- login_required=False, context_processors=None, form_class=None):
- """
- Generic object-creation function.
-
- Templates: ``<app_label>/<model_name>_form.html``
- Context:
- form
- the form for the object
- """
- if extra_context is None: extra_context = {}
- if login_required and not request.user.is_authenticated():
- return redirect_to_login(request.path)
-
- model, form_class = get_model_and_form_class(model, form_class)
- if request.method == 'POST':
- form = form_class(request.POST, request.FILES)
- if form.is_valid():
- new_object = form.save()
-
- msg = ugettext("The %(verbose_name)s was created successfully.") %\
- {"verbose_name": model._meta.verbose_name}
- messages.success(request, msg, fail_silently=True)
- return redirect(post_save_redirect, new_object)
- else:
- form = form_class()
-
- # Create the template, context, response
- if not template_name:
- template_name = "%s/%s_form.html" % (model._meta.app_label, model._meta.object_name.lower())
- t = template_loader.get_template(template_name)
- c = RequestContext(request, {
- 'form': form,
- }, context_processors)
- apply_extra_context(extra_context, c)
- return HttpResponse(t.render(c))
-
-def update_object(request, model=None, object_id=None, slug=None,
- slug_field='slug', template_name=None, template_loader=loader,
- extra_context=None, post_save_redirect=None, login_required=False,
- context_processors=None, template_object_name='object',
- form_class=None):
- """
- Generic object-update function.
-
- Templates: ``<app_label>/<model_name>_form.html``
- Context:
- form
- the form for the object
- object
- the original object being edited
- """
- if extra_context is None: extra_context = {}
- if login_required and not request.user.is_authenticated():
- return redirect_to_login(request.path)
-
- model, form_class = get_model_and_form_class(model, form_class)
- obj = lookup_object(model, object_id, slug, slug_field)
-
- if request.method == 'POST':
- form = form_class(request.POST, request.FILES, instance=obj)
- if form.is_valid():
- obj = form.save()
- msg = ugettext("The %(verbose_name)s was updated successfully.") %\
- {"verbose_name": model._meta.verbose_name}
- messages.success(request, msg, fail_silently=True)
- return redirect(post_save_redirect, obj)
- else:
- form = form_class(instance=obj)
-
- if not template_name:
- template_name = "%s/%s_form.html" % (model._meta.app_label, model._meta.object_name.lower())
- t = template_loader.get_template(template_name)
- c = RequestContext(request, {
- 'form': form,
- template_object_name: obj,
- }, context_processors)
- apply_extra_context(extra_context, c)
- response = HttpResponse(t.render(c))
- populate_xheaders(request, response, model, getattr(obj, obj._meta.pk.attname))
- return response
-
-def delete_object(request, model, post_delete_redirect, object_id=None,
- slug=None, slug_field='slug', template_name=None,
- template_loader=loader, extra_context=None, login_required=False,
- context_processors=None, template_object_name='object'):
- """
- Generic object-delete function.
-
- The given template will be used to confirm deletetion if this view is
- fetched using GET; for safty, deletion will only be performed if this
- view is POSTed.
-
- Templates: ``<app_label>/<model_name>_confirm_delete.html``
- Context:
- object
- the original object being deleted
- """
- if extra_context is None: extra_context = {}
- if login_required and not request.user.is_authenticated():
- return redirect_to_login(request.path)
-
- obj = lookup_object(model, object_id, slug, slug_field)
-
- if request.method == 'POST':
- obj.delete()
- msg = ugettext("The %(verbose_name)s was deleted.") %\
- {"verbose_name": model._meta.verbose_name}
- messages.success(request, msg, fail_silently=True)
- return HttpResponseRedirect(post_delete_redirect)
- else:
- if not template_name:
- template_name = "%s/%s_confirm_delete.html" % (model._meta.app_label, model._meta.object_name.lower())
- t = template_loader.get_template(template_name)
- c = RequestContext(request, {
- template_object_name: obj,
- }, context_processors)
- apply_extra_context(extra_context, c)
- response = HttpResponse(t.render(c))
- populate_xheaders(request, response, model, getattr(obj, obj._meta.pk.attname))
- return response
diff --git a/django/views/generic/date_based.py b/django/views/generic/date_based.py
deleted file mode 100644
index 75094aa775..0000000000
--- a/django/views/generic/date_based.py
+++ /dev/null
@@ -1,376 +0,0 @@
-import datetime
-import time
-
-from django.template import loader, RequestContext
-from django.core.exceptions import ObjectDoesNotExist
-from django.core.xheaders import populate_xheaders
-from django.db.models.fields import DateTimeField
-from django.http import Http404, HttpResponse
-from django.utils import timezone
-
-import warnings
-warnings.warn(
- 'Function-based generic views have been deprecated; use class-based views instead.',
- DeprecationWarning
-)
-
-
-def archive_index(request, queryset, date_field, num_latest=15,
- template_name=None, template_loader=loader,
- extra_context=None, allow_empty=True, context_processors=None,
- mimetype=None, allow_future=False, template_object_name='latest'):
- """
- Generic top-level archive of date-based objects.
-
- Templates: ``<app_label>/<model_name>_archive.html``
- Context:
- date_list
- List of years
- latest
- Latest N (defaults to 15) objects by date
- """
- if extra_context is None: extra_context = {}
- model = queryset.model
- if not allow_future:
- queryset = queryset.filter(**{'%s__lte' % date_field: timezone.now()})
- date_list = queryset.dates(date_field, 'year')[::-1]
- if not date_list and not allow_empty:
- raise Http404("No %s available" % model._meta.verbose_name)
-
- if date_list and num_latest:
- latest = queryset.order_by('-'+date_field)[:num_latest]
- else:
- latest = None
-
- if not template_name:
- template_name = "%s/%s_archive.html" % (model._meta.app_label, model._meta.object_name.lower())
- t = template_loader.get_template(template_name)
- c = RequestContext(request, {
- 'date_list' : date_list,
- template_object_name : latest,
- }, context_processors)
- for key, value in extra_context.items():
- if callable(value):
- c[key] = value()
- else:
- c[key] = value
- return HttpResponse(t.render(c), mimetype=mimetype)
-
-def archive_year(request, year, queryset, date_field, template_name=None,
- template_loader=loader, extra_context=None, allow_empty=False,
- context_processors=None, template_object_name='object', mimetype=None,
- make_object_list=False, allow_future=False):
- """
- Generic yearly archive view.
-
- Templates: ``<app_label>/<model_name>_archive_year.html``
- Context:
- date_list
- List of months in this year with objects
- year
- This year
- object_list
- List of objects published in the given month
- (Only available if make_object_list argument is True)
- """
- if extra_context is None: extra_context = {}
- model = queryset.model
- now = timezone.now()
-
- lookup_kwargs = {'%s__year' % date_field: year}
-
- # Only bother to check current date if the year isn't in the past and future objects aren't requested.
- if int(year) >= now.year and not allow_future:
- lookup_kwargs['%s__lte' % date_field] = now
- date_list = queryset.filter(**lookup_kwargs).dates(date_field, 'month')
- if not date_list and not allow_empty:
- raise Http404
- if make_object_list:
- object_list = queryset.filter(**lookup_kwargs)
- else:
- object_list = []
- if not template_name:
- template_name = "%s/%s_archive_year.html" % (model._meta.app_label, model._meta.object_name.lower())
- t = template_loader.get_template(template_name)
- c = RequestContext(request, {
- 'date_list': date_list,
- 'year': year,
- '%s_list' % template_object_name: object_list,
- }, context_processors)
- for key, value in extra_context.items():
- if callable(value):
- c[key] = value()
- else:
- c[key] = value
- return HttpResponse(t.render(c), mimetype=mimetype)
-
-def archive_month(request, year, month, queryset, date_field,
- month_format='%b', template_name=None, template_loader=loader,
- extra_context=None, allow_empty=False, context_processors=None,
- template_object_name='object', mimetype=None, allow_future=False):
- """
- Generic monthly archive view.
-
- Templates: ``<app_label>/<model_name>_archive_month.html``
- Context:
- date_list:
- List of days in this month with objects
- month:
- (date) this month
- next_month:
- (date) the first day of the next month, or None if the next month is in the future
- previous_month:
- (date) the first day of the previous month
- object_list:
- list of objects published in the given month
- """
- if extra_context is None: extra_context = {}
- try:
- tt = time.strptime("%s-%s" % (year, month), '%s-%s' % ('%Y', month_format))
- date = datetime.date(*tt[:3])
- except ValueError:
- raise Http404
-
- model = queryset.model
- now = timezone.now()
-
- # Calculate first and last day of month, for use in a date-range lookup.
- first_day = date.replace(day=1)
- if first_day.month == 12:
- last_day = first_day.replace(year=first_day.year + 1, month=1)
- else:
- last_day = first_day.replace(month=first_day.month + 1)
- lookup_kwargs = {
- '%s__gte' % date_field: first_day,
- '%s__lt' % date_field: last_day,
- }
-
- # Only bother to check current date if the month isn't in the past and future objects are requested.
- if last_day >= now.date() and not allow_future:
- lookup_kwargs['%s__lte' % date_field] = now
- object_list = queryset.filter(**lookup_kwargs)
- date_list = object_list.dates(date_field, 'day')
- if not object_list and not allow_empty:
- raise Http404
-
- # Calculate the next month, if applicable.
- if allow_future:
- next_month = last_day
- elif last_day <= datetime.date.today():
- next_month = last_day
- else:
- next_month = None
-
- # Calculate the previous month
- if first_day.month == 1:
- previous_month = first_day.replace(year=first_day.year-1,month=12)
- else:
- previous_month = first_day.replace(month=first_day.month-1)
-
- if not template_name:
- template_name = "%s/%s_archive_month.html" % (model._meta.app_label, model._meta.object_name.lower())
- t = template_loader.get_template(template_name)
- c = RequestContext(request, {
- 'date_list': date_list,
- '%s_list' % template_object_name: object_list,
- 'month': date,
- 'next_month': next_month,
- 'previous_month': previous_month,
- }, context_processors)
- for key, value in extra_context.items():
- if callable(value):
- c[key] = value()
- else:
- c[key] = value
- return HttpResponse(t.render(c), mimetype=mimetype)
-
-def archive_week(request, year, week, queryset, date_field,
- template_name=None, template_loader=loader,
- extra_context=None, allow_empty=True, context_processors=None,
- template_object_name='object', mimetype=None, allow_future=False):
- """
- Generic weekly archive view.
-
- Templates: ``<app_label>/<model_name>_archive_week.html``
- Context:
- week:
- (date) this week
- object_list:
- list of objects published in the given week
- """
- if extra_context is None: extra_context = {}
- try:
- tt = time.strptime(year+'-0-'+week, '%Y-%w-%U')
- date = datetime.date(*tt[:3])
- except ValueError:
- raise Http404
-
- model = queryset.model
- now = timezone.now()
-
- # Calculate first and last day of week, for use in a date-range lookup.
- first_day = date
- last_day = date + datetime.timedelta(days=7)
- lookup_kwargs = {
- '%s__gte' % date_field: first_day,
- '%s__lt' % date_field: last_day,
- }
-
- # Only bother to check current date if the week isn't in the past and future objects aren't requested.
- if last_day >= now.date() and not allow_future:
- lookup_kwargs['%s__lte' % date_field] = now
- object_list = queryset.filter(**lookup_kwargs)
- if not object_list and not allow_empty:
- raise Http404
- if not template_name:
- template_name = "%s/%s_archive_week.html" % (model._meta.app_label, model._meta.object_name.lower())
- t = template_loader.get_template(template_name)
- c = RequestContext(request, {
- '%s_list' % template_object_name: object_list,
- 'week': date,
- })
- for key, value in extra_context.items():
- if callable(value):
- c[key] = value()
- else:
- c[key] = value
- return HttpResponse(t.render(c), mimetype=mimetype)
-
-def archive_day(request, year, month, day, queryset, date_field,
- month_format='%b', day_format='%d', template_name=None,
- template_loader=loader, extra_context=None, allow_empty=False,
- context_processors=None, template_object_name='object',
- mimetype=None, allow_future=False):
- """
- Generic daily archive view.
-
- Templates: ``<app_label>/<model_name>_archive_day.html``
- Context:
- object_list:
- list of objects published that day
- day:
- (datetime) the day
- previous_day
- (datetime) the previous day
- next_day
- (datetime) the next day, or None if the current day is today
- """
- if extra_context is None: extra_context = {}
- try:
- tt = time.strptime('%s-%s-%s' % (year, month, day),
- '%s-%s-%s' % ('%Y', month_format, day_format))
- date = datetime.date(*tt[:3])
- except ValueError:
- raise Http404
-
- model = queryset.model
- now = timezone.now()
-
- if isinstance(model._meta.get_field(date_field), DateTimeField):
- lookup_kwargs = {'%s__range' % date_field: (datetime.datetime.combine(date, datetime.time.min), datetime.datetime.combine(date, datetime.time.max))}
- else:
- lookup_kwargs = {date_field: date}
-
- # Only bother to check current date if the date isn't in the past and future objects aren't requested.
- if date >= now.date() and not allow_future:
- lookup_kwargs['%s__lte' % date_field] = now
- object_list = queryset.filter(**lookup_kwargs)
- if not allow_empty and not object_list:
- raise Http404
-
- # Calculate the next day, if applicable.
- if allow_future:
- next_day = date + datetime.timedelta(days=1)
- elif date < datetime.date.today():
- next_day = date + datetime.timedelta(days=1)
- else:
- next_day = None
-
- if not template_name:
- template_name = "%s/%s_archive_day.html" % (model._meta.app_label, model._meta.object_name.lower())
- t = template_loader.get_template(template_name)
- c = RequestContext(request, {
- '%s_list' % template_object_name: object_list,
- 'day': date,
- 'previous_day': date - datetime.timedelta(days=1),
- 'next_day': next_day,
- }, context_processors)
- for key, value in extra_context.items():
- if callable(value):
- c[key] = value()
- else:
- c[key] = value
- return HttpResponse(t.render(c), mimetype=mimetype)
-
-def archive_today(request, **kwargs):
- """
- Generic daily archive view for today. Same as archive_day view.
- """
- today = datetime.date.today()
- kwargs.update({
- 'year': str(today.year),
- 'month': today.strftime('%b').lower(),
- 'day': str(today.day),
- })
- return archive_day(request, **kwargs)
-
-def object_detail(request, year, month, day, queryset, date_field,
- month_format='%b', day_format='%d', object_id=None, slug=None,
- slug_field='slug', template_name=None, template_name_field=None,
- template_loader=loader, extra_context=None, context_processors=None,
- template_object_name='object', mimetype=None, allow_future=False):
- """
- Generic detail view from year/month/day/slug or year/month/day/id structure.
-
- Templates: ``<app_label>/<model_name>_detail.html``
- Context:
- object:
- the object to be detailed
- """
- if extra_context is None: extra_context = {}
- try:
- tt = time.strptime('%s-%s-%s' % (year, month, day),
- '%s-%s-%s' % ('%Y', month_format, day_format))
- date = datetime.date(*tt[:3])
- except ValueError:
- raise Http404
-
- model = queryset.model
- now = timezone.now()
-
- if isinstance(model._meta.get_field(date_field), DateTimeField):
- lookup_kwargs = {'%s__range' % date_field: (datetime.datetime.combine(date, datetime.time.min), datetime.datetime.combine(date, datetime.time.max))}
- else:
- lookup_kwargs = {date_field: date}
-
- # Only bother to check current date if the date isn't in the past and future objects aren't requested.
- if date >= now.date() and not allow_future:
- lookup_kwargs['%s__lte' % date_field] = now
- if object_id:
- lookup_kwargs['%s__exact' % model._meta.pk.name] = object_id
- elif slug and slug_field:
- lookup_kwargs['%s__exact' % slug_field] = slug
- else:
- raise AttributeError("Generic detail view must be called with either an object_id or a slug/slugfield")
- try:
- obj = queryset.get(**lookup_kwargs)
- except ObjectDoesNotExist:
- raise Http404("No %s found for" % model._meta.verbose_name)
- if not template_name:
- template_name = "%s/%s_detail.html" % (model._meta.app_label, model._meta.object_name.lower())
- if template_name_field:
- template_name_list = [getattr(obj, template_name_field), template_name]
- t = template_loader.select_template(template_name_list)
- else:
- t = template_loader.get_template(template_name)
- c = RequestContext(request, {
- template_object_name: obj,
- }, context_processors)
- for key, value in extra_context.items():
- if callable(value):
- c[key] = value()
- else:
- c[key] = value
- response = HttpResponse(t.render(c), mimetype=mimetype)
- populate_xheaders(request, response, model, getattr(obj, obj._meta.pk.name))
- return response
diff --git a/django/views/generic/list_detail.py b/django/views/generic/list_detail.py
deleted file mode 100644
index 22414ae216..0000000000
--- a/django/views/generic/list_detail.py
+++ /dev/null
@@ -1,152 +0,0 @@
-from django.template import loader, RequestContext
-from django.http import Http404, HttpResponse
-from django.core.xheaders import populate_xheaders
-from django.core.paginator import Paginator, InvalidPage
-from django.core.exceptions import ObjectDoesNotExist
-
-import warnings
-warnings.warn(
- 'Function-based generic views have been deprecated; use class-based views instead.',
- DeprecationWarning
-)
-
-
-def object_list(request, queryset, paginate_by=None, page=None,
- allow_empty=True, template_name=None, template_loader=loader,
- extra_context=None, context_processors=None, template_object_name='object',
- mimetype=None):
- """
- Generic list of objects.
-
- Templates: ``<app_label>/<model_name>_list.html``
- Context:
- object_list
- list of objects
- is_paginated
- are the results paginated?
- results_per_page
- number of objects per page (if paginated)
- has_next
- is there a next page?
- has_previous
- is there a prev page?
- page
- the current page
- next
- the next page
- previous
- the previous page
- pages
- number of pages, total
- hits
- number of objects, total
- last_on_page
- the result number of the last of object in the
- object_list (1-indexed)
- first_on_page
- the result number of the first object in the
- object_list (1-indexed)
- page_range:
- A list of the page numbers (1-indexed).
- """
- if extra_context is None: extra_context = {}
- queryset = queryset._clone()
- if paginate_by:
- paginator = Paginator(queryset, paginate_by, allow_empty_first_page=allow_empty)
- if not page:
- page = request.GET.get('page', 1)
- try:
- page_number = int(page)
- except ValueError:
- if page == 'last':
- page_number = paginator.num_pages
- else:
- # Page is not 'last', nor can it be converted to an int.
- raise Http404
- try:
- page_obj = paginator.page(page_number)
- except InvalidPage:
- raise Http404
- c = RequestContext(request, {
- '%s_list' % template_object_name: page_obj.object_list,
- 'paginator': paginator,
- 'page_obj': page_obj,
- 'is_paginated': page_obj.has_other_pages(),
-
- # Legacy template context stuff. New templates should use page_obj
- # to access this instead.
- 'results_per_page': paginator.per_page,
- 'has_next': page_obj.has_next(),
- 'has_previous': page_obj.has_previous(),
- 'page': page_obj.number,
- 'next': page_obj.next_page_number(),
- 'previous': page_obj.previous_page_number(),
- 'first_on_page': page_obj.start_index(),
- 'last_on_page': page_obj.end_index(),
- 'pages': paginator.num_pages,
- 'hits': paginator.count,
- 'page_range': paginator.page_range,
- }, context_processors)
- else:
- c = RequestContext(request, {
- '%s_list' % template_object_name: queryset,
- 'paginator': None,
- 'page_obj': None,
- 'is_paginated': False,
- }, context_processors)
- if not allow_empty and len(queryset) == 0:
- raise Http404
- for key, value in extra_context.items():
- if callable(value):
- c[key] = value()
- else:
- c[key] = value
- if not template_name:
- model = queryset.model
- template_name = "%s/%s_list.html" % (model._meta.app_label, model._meta.object_name.lower())
- t = template_loader.get_template(template_name)
- return HttpResponse(t.render(c), mimetype=mimetype)
-
-def object_detail(request, queryset, object_id=None, slug=None,
- slug_field='slug', template_name=None, template_name_field=None,
- template_loader=loader, extra_context=None,
- context_processors=None, template_object_name='object',
- mimetype=None):
- """
- Generic detail of an object.
-
- Templates: ``<app_label>/<model_name>_detail.html``
- Context:
- object
- the object
- """
- if extra_context is None: extra_context = {}
- model = queryset.model
- if object_id:
- queryset = queryset.filter(pk=object_id)
- elif slug and slug_field:
- queryset = queryset.filter(**{slug_field: slug})
- else:
- raise AttributeError("Generic detail view must be called with either an object_id or a slug/slug_field.")
- try:
- obj = queryset.get()
- except ObjectDoesNotExist:
- raise Http404("No %s found matching the query" % (model._meta.verbose_name))
- if not template_name:
- template_name = "%s/%s_detail.html" % (model._meta.app_label, model._meta.object_name.lower())
- if template_name_field:
- template_name_list = [getattr(obj, template_name_field), template_name]
- t = template_loader.select_template(template_name_list)
- else:
- t = template_loader.get_template(template_name)
- c = RequestContext(request, {
- template_object_name: obj,
- }, context_processors)
- for key, value in extra_context.items():
- if callable(value):
- c[key] = value()
- else:
- c[key] = value
- response = HttpResponse(t.render(c), mimetype=mimetype)
- populate_xheaders(request, response, model, getattr(obj, obj._meta.pk.name))
- return response
diff --git a/django/views/generic/simple.py b/django/views/generic/simple.py
deleted file mode 100644
index f63860a4cf..0000000000
--- a/django/views/generic/simple.py
+++ /dev/null
@@ -1,68 +0,0 @@
-from django.template import loader, RequestContext
-from django.http import HttpResponse, HttpResponseRedirect, HttpResponsePermanentRedirect, HttpResponseGone
-from django.utils.log import getLogger
-
-import warnings
-warnings.warn(
- 'Function-based generic views have been deprecated; use class-based views instead.',
- DeprecationWarning
-)
-
-logger = getLogger('django.request')
-
-
-def direct_to_template(request, template, extra_context=None, mimetype=None, **kwargs):
- """
- Render a given template with any extra URL parameters in the context as
- ``{{ params }}``.
- """
- if extra_context is None: extra_context = {}
- dictionary = {'params': kwargs}
- for key, value in extra_context.items():
- if callable(value):
- dictionary[key] = value()
- else:
- dictionary[key] = value
- c = RequestContext(request, dictionary)
- t = loader.get_template(template)
- return HttpResponse(t.render(c), content_type=mimetype)
-
-def redirect_to(request, url, permanent=True, query_string=False, **kwargs):
- """
- Redirect to a given URL.
-
- The given url may contain dict-style string formatting, which will be
- interpolated against the params in the URL. For example, to redirect from
- ``/foo/<id>/`` to ``/bar/<id>/``, you could use the following URLconf::
-
- urlpatterns = patterns('',
- ('^foo/(?P<id>\d+)/$', 'django.views.generic.simple.redirect_to', {'url' : '/bar/%(id)s/'}),
- )
-
- If the given url is ``None``, a HttpResponseGone (410) will be issued.
-
- If the ``permanent`` argument is False, then the response will have a 302
- HTTP status code. Otherwise, the status code will be 301.
-
- If the ``query_string`` argument is True, then the GET query string
- from the request is appended to the URL.
-
- """
- args = request.META.get('QUERY_STRING', '')
-
- if url is not None:
- if kwargs:
- url = url % kwargs
-
- if args and query_string:
- url = "%s?%s" % (url, args)
-
- klass = permanent and HttpResponsePermanentRedirect or HttpResponseRedirect
- return klass(url)
- else:
- logger.warning('Gone: %s', request.path,
- extra={
- 'status_code': 410,
- 'request': request
- })
- return HttpResponseGone()