{% endif %}
+ {% if show_save_as_new %}{%endif%}
+ {% if show_save_and_add_another %}{% endif %}
+ {% if show_save_and_continue %}{% endif %}
+ {% if show_save %}{% endif %}
+
diff --git a/django/core/defaulttags.py b/django/core/defaulttags.py
index 81bce67bd4..46905c50a6 100644
--- a/django/core/defaulttags.py
+++ b/django/core/defaulttags.py
@@ -98,6 +98,9 @@ class ForNode(template.Node):
# shortcuts for current loop iteration number
'counter0': i,
'counter': i+1,
+ # reverse counter iteration numbers
+ 'revcounter': len_values - i,
+ 'revcounter0': len_values - i - 1,
# boolean values designating first and last times through loop
'first': (i == 0),
'last': (i == len_values - 1),
@@ -445,6 +448,10 @@ def do_for(parser, token):
========================== ================================================
``forloop.counter`` The current iteration of the loop (1-indexed)
``forloop.counter0`` The current iteration of the loop (0-indexed)
+ ``forloop.revcounter`` The number of iterations from the end of the
+ loop (1-indexed)
+ ``forloop.revcounter0`` The number of iterations from the end of the
+ loop (0-indexed)
``forloop.first`` True if this is the first time through the loop
``forloop.last`` True if this is the last time through the loop
``forloop.parentloop`` For nested loops, this is the loop "above" the
diff --git a/django/core/management.py b/django/core/management.py
index d494564d6b..f3accd84cc 100644
--- a/django/core/management.py
+++ b/django/core/management.py
@@ -156,18 +156,23 @@ get_sql_reset.args = APP_ARGS
def get_sql_initial_data(mod):
"Returns a list of the initial INSERT SQL statements for the given module."
+ from django.core import db
output = []
app_label = mod._MODELS[0]._meta.app_label
output.append(_get_packages_insert(app_label))
app_dir = os.path.normpath(os.path.join(os.path.dirname(mod.__file__), '../sql'))
for klass in mod._MODELS:
opts = klass._meta
+
# Add custom SQL, if it's available.
- sql_file_name = os.path.join(app_dir, opts.module_name + '.sql')
- if os.path.exists(sql_file_name):
- fp = open(sql_file_name, 'r')
- output.append(fp.read())
- fp.close()
+ sql_files = [os.path.join(app_dir, opts.module_name + '.' + db.DATABASE_ENGINE + '.sql'),
+ os.path.join(app_dir, opts.module_name + '.sql')]
+ for sql_file in sql_files:
+ if os.path.exists(sql_file):
+ fp = open(sql_file)
+ output.append(fp.read())
+ fp.close()
+
# Content types.
output.append(_get_contenttype_insert(opts))
# Permissions.
@@ -653,4 +658,4 @@ def createcachetable(tablename):
for statement in index_output:
curs.execute(statement)
db.db.commit()
-createcachetable.args = "[tablename]"
\ No newline at end of file
+createcachetable.args = "[tablename]"
diff --git a/django/templatetags/admin_modify.py b/django/templatetags/admin_modify.py
index 687306a8b5..1ce938b9a9 100644
--- a/django/templatetags/admin_modify.py
+++ b/django/templatetags/admin_modify.py
@@ -1,4 +1,5 @@
from django.core import template, template_loader, meta
+from django.core.template_loader import render_to_string
from django.conf.settings import ADMIN_MEDIA_PREFIX
from django.utils.text import capfirst
from django.utils.html import escape
@@ -8,42 +9,54 @@ from django.views.admin.main import AdminBoundField
import re
class IncludeAdminScriptNode(template.Node):
- def __init__(self, var):
- self.var = var
+ def __init__(self, var):
+ self.var = var
- def render(self, context):
+ def render(self, context):
resolved = template.resolve_variable(self.var, context)
- return '' % \
- (ADMIN_MEDIA_PREFIX, resolved)
+ return '' % \
+ (ADMIN_MEDIA_PREFIX, resolved)
class SubmitRowNode(template.Node):
- def __init__(self):
- pass
+ def __init__(self):
+ pass
- def render(self, context):
- change = context['change']
- add = context['add']
- show_delete = context['show_delete']
- ordered_objects = context['ordered_objects']
- save_as = context['save_as']
- has_delete_permission = context['has_delete_permission']
- is_popup = context['is_popup']
+ def render(self, context):
+ change = context['change']
+ add = context['add']
+ show_delete = context['show_delete']
+ ordered_objects = context['ordered_objects']
+ save_as = context['save_as']
+ has_delete_permission = context['has_delete_permission']
+ is_popup = context['is_popup']
- t = ['
']
- onclick_attrib = ordered_objects and change and 'onclick="submitOrderForm();"' or ''
+
+ output = render_to_string('admin_submit_line', {
+ 'onclick_attrib' : (ordered_objects and change
+ and 'onclick="submitOrderForm();"' or ''),
+ 'show_delete_link' : (not is_popup and has_delete_permission
+ and (change or show_delete)),
+ 'show_save_as_new' : not is_popup and change and save_as,
+ 'show_save_and_add_another': not is_popup and (not save_as or add),
+ 'show_save_and_continue': not is_popup,
+ 'show_save': True
+ }, context);
+ context.pop()
+ return output;
+# t = ['
']
- if not is_popup:
- if has_delete_permission and (change or show_delete):
- t.append('