diff --git a/AUTHORS b/AUTHORS index e5d43deaae..cd02cd261a 100644 --- a/AUTHORS +++ b/AUTHORS @@ -45,6 +45,7 @@ answer newbie questions, and generally made Django that much better: Antonio Cavedoni C8E Amit Chakradeo + ChaosKCW Matt Croydon Jonathan Daugherty (cygnus) Jason Davies (Esaj) diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py index fb5e44e986..4c66e364ad 100644 --- a/django/db/models/fields/__init__.py +++ b/django/db/models/fields/__init__.py @@ -9,8 +9,8 @@ from django.utils.text import capfirst from django.utils.translation import gettext_lazy, ngettext import datetime, os -# Random entropy string used by "default" param. -NOT_PROVIDED = 'oijpwojefiojpanv' +class NOT_PROVIDED: + pass # Values for filter_interface. HORIZONTAL, VERTICAL = 1, 2 @@ -158,11 +158,11 @@ class Field(object): def has_default(self): "Returns a boolean of whether this field has a default value." - return self.default != NOT_PROVIDED + return self.default is not NOT_PROVIDED def get_default(self): "Returns the default value for this field." - if self.default != NOT_PROVIDED: + if self.default is not NOT_PROVIDED: if callable(self.default): return self.default() return self.default diff --git a/django/views/generic/create_update.py b/django/views/generic/create_update.py index 7c4a6426a6..f1baa96bb9 100644 --- a/django/views/generic/create_update.py +++ b/django/views/generic/create_update.py @@ -72,7 +72,8 @@ def create_object(request, model, template_name=None, def update_object(request, model, object_id=None, slug=None, slug_field=None, template_name=None, template_loader=loader, extra_lookup_kwargs={}, extra_context={}, post_save_redirect=None, - login_required=False, follow=None, context_processors=None): + login_required=False, follow=None, context_processors=None, + template_object_name='object'): """ Generic object-update function. @@ -130,7 +131,7 @@ def update_object(request, model, object_id=None, slug=None, t = template_loader.get_template(template_name) c = RequestContext(request, { 'form': form, - 'object': object, + template_object_name: object, }, context_processors) for key, value in extra_context.items(): if callable(value): @@ -144,7 +145,7 @@ def update_object(request, model, object_id=None, slug=None, def delete_object(request, model, post_delete_redirect, object_id=None, slug=None, slug_field=None, template_name=None, template_loader=loader, extra_lookup_kwargs={}, extra_context={}, - login_required=False, context_processors=None): + login_required=False, context_processors=None, template_object_name='object'): """ Generic object-delete function. @@ -184,7 +185,7 @@ def delete_object(request, model, post_delete_redirect, template_name = "%s/%s_confirm_delete" % (model._meta.app_label, model._meta.object_name.lower()) t = template_loader.get_template(template_name) c = RequestContext(request, { - 'object': object, + template_object_name: object, }, context_processors) for key, value in extra_context.items(): if callable(value): diff --git a/django/views/generic/date_based.py b/django/views/generic/date_based.py index bfb6c42882..5946f720be 100644 --- a/django/views/generic/date_based.py +++ b/django/views/generic/date_based.py @@ -80,7 +80,8 @@ def archive_year(request, year, queryset, date_field, template_name=None, def archive_month(request, year, month, queryset, date_field, month_format='%b', template_name=None, template_loader=loader, - extra_context={}, allow_empty=False, context_processors=None): + extra_context={}, allow_empty=False, context_processors=None, + template_object_name='object'): """ Generic monthly archive view. @@ -119,7 +120,7 @@ def archive_month(request, year, month, queryset, date_field, template_name = "%s/%s_archive_month" % (model._meta.app_label, model._meta.object_name.lower()) t = template_loader.get_template(template_name) c = RequestContext(request, { - 'object_list': object_list, + '%s_list' % template_object_name: object_list, 'month': date, 'next_month': (last_day < datetime.date.today()) and (last_day + datetime.timedelta(days=1)) or None, 'previous_month': first_day - datetime.timedelta(days=1), @@ -134,7 +135,7 @@ def archive_month(request, year, month, queryset, date_field, def archive_day(request, year, month, day, queryset, date_field, month_format='%b', day_format='%d', template_name=None, template_loader=loader, extra_context={}, allow_empty=False, - context_processors=None): + context_processors=None, template_object_name='object'): """ Generic daily archive view. @@ -169,7 +170,7 @@ def archive_day(request, year, month, day, queryset, date_field, template_name = "%s/%s_archive_day" % (model._meta.app_label, model._meta.object_name.lower()) t = template_loader.get_template(template_name) c = RequestContext(request, { - 'object_list': object_list, + '%s_list' % template_object_name: object_list, 'day': date, 'previous_day': date - datetime.timedelta(days=1), 'next_day': (date < datetime.date.today()) and (date + datetime.timedelta(days=1)) or None, @@ -196,7 +197,8 @@ def archive_today(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=None, template_name=None, template_name_field=None, - template_loader=loader, extra_context={}, context_processors=None): + template_loader=loader, extra_context={}, context_processors=None, + template_object_name='object'): """ Generic detail view from year/month/day/slug or year/month/day/id structure. @@ -236,7 +238,7 @@ def object_detail(request, year, month, day, queryset, date_field, else: t = template_loader.get_template(template_name) c = RequestContext(request, { - 'object': obj, + template_object_name: obj, }, context_processors) for key, value in extra_context.items(): if callable(value): diff --git a/django/views/generic/list_detail.py b/django/views/generic/list_detail.py index b5e26873ca..6184a57603 100644 --- a/django/views/generic/list_detail.py +++ b/django/views/generic/list_detail.py @@ -6,7 +6,7 @@ from django.core.exceptions import ObjectDoesNotExist def object_list(request, queryset, paginate_by=None, allow_empty=False, template_name=None, template_loader=loader, - extra_context={}, context_processors=None): + extra_context={}, context_processors=None, template_object_name='object'): """ Generic list of objects. @@ -47,7 +47,7 @@ def object_list(request, queryset, paginate_by=None, allow_empty=False, else: raise Http404 c = RequestContext(request, { - 'object_list': object_list, + '%s_list' % template_object_name: object_list, 'is_paginated': paginator.pages > 1, 'results_per_page': paginate_by, 'has_next': paginator.has_next_page(page - 1), @@ -60,7 +60,7 @@ def object_list(request, queryset, paginate_by=None, allow_empty=False, }, context_processors) else: c = RequestContext(request, { - 'object_list': queryset, + '%s_list' % template_object_name: queryset, 'is_paginated': False }, context_processors) if not allow_empty and len(queryset) == 0: @@ -78,7 +78,7 @@ def object_list(request, queryset, paginate_by=None, allow_empty=False, def object_detail(request, queryset, object_id=None, slug=None, slug_field=None, template_name=None, template_name_field=None, template_loader=loader, extra_context={}, - context_processors=None): + context_processors=None, template_object_name='object'): """ Generic list of objects. @@ -106,7 +106,7 @@ def object_detail(request, queryset, object_id=None, slug=None, else: t = template_loader.get_template(template_name) c = RequestContext(request, { - 'object': obj, + template_object_name: obj, }, context_processors) for key, value in extra_context.items(): if callable(value): diff --git a/docs/generic_views.txt b/docs/generic_views.txt index 90f40646ee..68c32bf92b 100644 --- a/docs/generic_views.txt +++ b/docs/generic_views.txt @@ -189,6 +189,10 @@ The date-based generic functions are: Takes an optional ``allow_empty`` parameter, as ``archive_index``. + **New in Django development version:** Takes an optional + ``template_object_name`` parameter, which designates the name of the + template variable to use. Default is ``'object'``. + Uses the template ``/_archive_month`` by default. Has the following template context: @@ -203,7 +207,11 @@ The date-based generic functions are: **New in Django development version.** The first day of the previous month (a datetime.date object) ``object_list`` - List of objects published in the given month + List of objects published in the given month. + In the Django development version, you can change this variable + name from ``object_list`` by using the ``template_object_name`` + parameter. (See above.) For example, if ``template_object_name`` is + ``foo``, the variable will be ``foo_list``. ``archive_day`` Daily archive. Requires that ``year``, ``month``, and ``day`` arguments be @@ -213,12 +221,20 @@ The date-based generic functions are: also pass ``day_format``, which defaults to ``"%d"`` (day of the month as a decimal number, 1-31). + **New in Django development version:** Takes an optional + ``template_object_name`` parameter, which designates the name of the + template variable to use. Default is ``'object'``. + Uses the template ``/_archive_day`` by default. Has the following template context: ``object_list`` - List of objects published this day + List of objects published on the given day. + In the Django development version, you can change this variable + name from ``object_list`` by using the ``template_object_name`` + parameter. (See above.) For example, if ``template_object_name`` is + ``foo``, the variable will be ``foo_list``. ``day`` The given day (a datetime.datetime object) ``previous_day`` @@ -250,6 +266,10 @@ The date-based generic functions are: As in ``archive_day``, ``object_detail`` takes optional ``month_format`` and ``day_format`` parameters. + **New in Django development version:** Takes an optional + ``template_object_name`` parameter, which designates the name of the + template variable to use. Default is ``'object'``. + .. _strftime docs: http://www.python.org/doc/current/lib/module-time.html#l2h-1941 Using list/detail generic views @@ -281,6 +301,9 @@ Individual views are: ``allow_empty`` If ``False`` and there are no objects to display, the view will raise a 404 instead of displaying an empty index page. ``False`` is default. + ``template_object_name`` **New in Django development version.** Designates + the name of the object template variable. Default + is ``'object'``. ======================= ================================================= Uses the template ``/_list`` by default. @@ -288,7 +311,11 @@ Individual views are: Has the following template context: ``object_list`` - List of objects + List of objects. In the Django development version, you can change + this variable name from ``object_list`` by using the + ``template_object_name`` parameter. (See above.) For example, if + ``template_object_name`` is ``foo``, the variable will be + ``foo_list``. ``is_paginated`` Are the results paginated? Either True or False @@ -358,6 +385,10 @@ The create/update/delete views are: ``list_detail.object_detail`` does (see above), and the same ``post_save_redirect`` as ``create_object`` does. + **New in Django development version:** Takes an optional + ``template_object_name`` parameter, which designates the name of the + template variable to use. Default is ``'object'``. + Uses the template ``/_form`` by default. Has the following template context: @@ -365,7 +396,11 @@ The create/update/delete views are: form The form wrapper for the object object - The original object being edited + The original object being edited. + In the Django development version, you can change this variable + name from ``object`` by using the ``template_object_name`` + parameter. (See above.) For example, if ``template_object_name`` is + ``foo``, the variable will be ``foo`` instead of ``object``. ``delete_object`` Delete an existing object. The given object will only actually be deleted @@ -380,7 +415,15 @@ The create/update/delete views are: ``/_confirm_delete`` by default. It uses no template if POSTed -- it simply deletes the object and redirects. + **New in Django development version:** Takes an optional + ``template_object_name`` parameter, which designates the name of the + template variable to use. Default is ``'object'``. + Has the following template context: object The object about to be deleted + In the Django development version, you can change this variable + name from ``object`` by using the ``template_object_name`` + parameter. (See above.) For example, if ``template_object_name`` is + ``foo``, the variable will be ``foo`` instead of ``object``.