diff --git a/django/views/generic/simple.py b/django/views/generic/simple.py index 4dffd69a47..8a054e1ce7 100644 --- a/django/views/generic/simple.py +++ b/django/views/generic/simple.py @@ -1,9 +1,28 @@ -from django.core import template_loader -from django.core.extensions import DjangoContext -from django.utils.httpwrappers import HttpResponse +from django.core.extensions import DjangoContext, render_to_response +from django.utils.httpwrappers import HttpResponse, HttpResponseRedirect, HttpResponseGone def direct_to_template(request, template, **kwargs): - """Render a given template with any extra parameters in the context.""" - t = template_loader.get_template(template) - c = DjangoContext(request, {'params' : kwargs}) - return HttpResponse(t.render(c)) \ No newline at end of file + """ + Render a given template with any extra URL parameters in the context as + ``{{ params }}``. + """ + return render_to_response(template, {'params' : kwargs}, context_instance=DjangoContext(request)) + +def redirect_to(request, url, **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//`` to ``/bar//``, you could use the following urlpattern:: + + urlpatterns = patterns('', + ('^foo/(?p\d+)/$', 'django.views.generic.simple.redirect_to', {'url' : '/bar/%(id)s/'}), + ) + + If the given url is ``None``, a HttpResponseGone (410) will be issued. + """ + if url is not None: + return HttpResponseRedirect(url % kwargs) + else: + return HttpResponseGone() \ No newline at end of file diff --git a/docs/generic_views.txt b/docs/generic_views.txt index 1c0de07a7a..9db1577d71 100644 --- a/docs/generic_views.txt +++ b/docs/generic_views.txt @@ -57,8 +57,8 @@ arguments may either come from the URL pattern (as ``month``, ``day``, ``year``, etc. do above) or from the additional-information dictionary (as for ``app_label``, ``module_name``, etc.). -All the generic views that follow require the ``app_label`` and ``module_name`` keys. -These values are easiest to explain through example:: +Most of the generic views that follow require the ``app_label`` and +``module_name`` keys. These values are easiest to explain through example:: >>> from django.models.blog import entries @@ -68,6 +68,42 @@ holds all your model definitions) and ``entries`` is the ``module_name`` of the ``module_name`` option of your model). In the docs below, these keys will not be repeated, but each generic view requires them. +Using "simple" generic views +============================ + +The ``django.views.generic.simple`` module contains simple views to handle a +couple of common cases: rendering a template when no view logic is needed, +and issuing a redirect. These views are: + +``direct_to_template`` + Renders a given template using any extra parameters passed in the + urlpattern; requires the ``template`` argument. + + For example, given the following URL patterns:: + + urlpatterns = patterns('django.views.generic.simple', + (r'^foo/$', 'direct_to_template', {'template' : 'foo_index'}), + (r'^foo/(?P\d+)/$', 'direct_to_template', {'template' : 'foo_detail'}), + ) + + ... a request to ``/foo/`` would cause the ``foo_index`` template to be + rendered, and a request to ``/foo/15/`` would cause the ``foo_detail`` + template to be rendered with a context variable ``{{ params.id }}`` that is + set to ``15``. + +``redirect_to`` + Issue a 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//`` to ``/bar//``, you could use the following urlpattern:: + + urlpatterns = patterns('django.views.generic.simple', + ('^foo/(?p\d+)/$', 'redirect_to', {'url' : '/bar/%(id)s/'}), + ) + + If the given url is ``None``, a HttpResponseGone (410) will be issued. + Using date-based generic views ============================== @@ -322,3 +358,4 @@ The create/update/delete views are: object The object about to be deleted +