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``.