summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorRaffaele Salmaso <raffaele@salmaso.org>2017-01-12 17:06:00 +0100
committerCarlton Gibson <carlton.gibson@noumenal.es>2018-02-28 08:49:40 +0100
commit5cc28dc752c3ae78456bb835c3ba195489fc26d7 (patch)
treedabc737b959f842c880d01542e48eb0dfe079cc5 /django
parent6e52e2554dcc902b446f9d371ed1e6a07f36d6ec (diff)
Fixed #27728 -- Allowed overriding admin templatetags templates.
Diffstat (limited to 'django')
-rw-r--r--django/contrib/admin/templates/admin/actions.html8
-rw-r--r--django/contrib/admin/templates/admin/change_form.html6
-rw-r--r--django/contrib/admin/templates/admin/change_form_object_tools.html8
-rw-r--r--django/contrib/admin/templates/admin/change_list.html9
-rw-r--r--django/contrib/admin/templates/admin/change_list_object_tools.html12
-rw-r--r--django/contrib/admin/templates/admin/date_hierarchy.html6
-rw-r--r--django/contrib/admin/templates/admin/submit_line.html2
-rw-r--r--django/contrib/admin/templatetags/admin_list.py63
-rw-r--r--django/contrib/admin/templatetags/admin_modify.py30
-rw-r--r--django/contrib/admin/templatetags/base.py31
10 files changed, 155 insertions, 20 deletions
diff --git a/django/contrib/admin/templates/admin/actions.html b/django/contrib/admin/templates/admin/actions.html
index 80ffa066ed..ef2232e13f 100644
--- a/django/contrib/admin/templates/admin/actions.html
+++ b/django/contrib/admin/templates/admin/actions.html
@@ -1,7 +1,13 @@
{% load i18n %}
<div class="actions">
+ {% block actions %}
+ {% block actions-form %}
{% for field in action_form %}{% if field.label %}<label>{{ field.label }} {% endif %}{{ field }}{% if field.label %}</label>{% endif %}{% endfor %}
+ {% endblock %}
+ {% block actions-submit %}
<button type="submit" class="button" title="{% trans "Run the selected action" %}" name="index" value="{{ action_index|default:0 }}">{% trans "Go" %}</button>
+ {% endblock %}
+ {% block actions-counter %}
{% if actions_selection_counter %}
<span class="action-counter" data-actions-icnt="{{ cl.result_list|length }}">{{ selection_note }}</span>
{% if cl.result_count != cl.result_list|length %}
@@ -12,4 +18,6 @@
<span class="clear"><a href="#">{% trans "Clear selection" %}</a></span>
{% endif %}
{% endif %}
+ {% endblock %}
+ {% endblock %}
</div>
diff --git a/django/contrib/admin/templates/admin/change_form.html b/django/contrib/admin/templates/admin/change_form.html
index f77e50a130..604747e6d9 100644
--- a/django/contrib/admin/templates/admin/change_form.html
+++ b/django/contrib/admin/templates/admin/change_form.html
@@ -28,11 +28,7 @@
{% if change %}{% if not is_popup %}
<ul class="object-tools">
{% block object-tools-items %}
- <li>
- {% url opts|admin_urlname:'history' original.pk|admin_urlquote as history_url %}
- <a href="{% add_preserved_filters history_url %}" class="historylink">{% trans "History" %}</a>
- </li>
- {% if has_absolute_url %}<li><a href="{{ absolute_url }}" class="viewsitelink">{% trans "View on site" %}</a></li>{% endif %}
+ {% change_form_object_tools %}
{% endblock %}
</ul>
{% endif %}{% endif %}
diff --git a/django/contrib/admin/templates/admin/change_form_object_tools.html b/django/contrib/admin/templates/admin/change_form_object_tools.html
new file mode 100644
index 0000000000..32487493a2
--- /dev/null
+++ b/django/contrib/admin/templates/admin/change_form_object_tools.html
@@ -0,0 +1,8 @@
+{% load i18n admin_urls %}
+{% block object-tools-items %}
+<li>
+ {% url opts|admin_urlname:'history' original.pk|admin_urlquote as history_url %}
+ <a href="{% add_preserved_filters history_url %}" class="historylink">{% trans "History" %}</a>
+</li>
+{% if has_absolute_url %}<li><a href="{{ absolute_url }}" class="viewsitelink">{% trans "View on site" %}</a></li>{% endif %}
+{% endblock %}
diff --git a/django/contrib/admin/templates/admin/change_list.html b/django/contrib/admin/templates/admin/change_list.html
index 34a4031799..0ffca672c0 100644
--- a/django/contrib/admin/templates/admin/change_list.html
+++ b/django/contrib/admin/templates/admin/change_list.html
@@ -42,14 +42,7 @@
{% block object-tools %}
<ul class="object-tools">
{% block object-tools-items %}
- {% if has_add_permission %}
- <li>
- {% url cl.opts|admin_urlname:'add' as add_url %}
- <a href="{% add_preserved_filters add_url is_popup to_field %}" class="addlink">
- {% blocktrans with cl.opts.verbose_name as name %}Add {{ name }}{% endblocktrans %}
- </a>
- </li>
- {% endif %}
+ {% change_list_object_tools %}
{% endblock %}
</ul>
{% endblock %}
diff --git a/django/contrib/admin/templates/admin/change_list_object_tools.html b/django/contrib/admin/templates/admin/change_list_object_tools.html
new file mode 100644
index 0000000000..5d6d458276
--- /dev/null
+++ b/django/contrib/admin/templates/admin/change_list_object_tools.html
@@ -0,0 +1,12 @@
+{% load i18n admin_urls %}
+
+{% block object-tools-items %}
+ {% if has_add_permission %}
+ <li>
+ {% url cl.opts|admin_urlname:'add' as add_url %}
+ <a href="{% add_preserved_filters add_url is_popup to_field %}" class="addlink">
+ {% blocktrans with cl.opts.verbose_name as name %}Add {{ name }}{% endblocktrans %}
+ </a>
+ </li>
+ {% endif %}
+{% endblock %}
diff --git a/django/contrib/admin/templates/admin/date_hierarchy.html b/django/contrib/admin/templates/admin/date_hierarchy.html
index ecbd2a1a00..65ae800134 100644
--- a/django/contrib/admin/templates/admin/date_hierarchy.html
+++ b/django/contrib/admin/templates/admin/date_hierarchy.html
@@ -1,10 +1,16 @@
{% if show %}
<div class="xfull">
<ul class="toplinks">
+{% block date-hierarchy-toplinks %}
+{% block date-hierarchy-back %}
{% if back %}<li class="date-back"><a href="{{ back.link }}">&lsaquo; {{ back.title }}</a></li>{% endif %}
+{% endblock %}
+{% block date-hierarchy-choices %}
{% for choice in choices %}
<li> {% if choice.link %}<a href="{{ choice.link }}">{% endif %}{{ choice.title }}{% if choice.link %}</a>{% endif %}</li>
{% endfor %}
+{% endblock %}
+{% endblock %}
</ul><br class="clear">
</div>
{% endif %}
diff --git a/django/contrib/admin/templates/admin/submit_line.html b/django/contrib/admin/templates/admin/submit_line.html
index 2e6cf057f0..26f3920ffa 100644
--- a/django/contrib/admin/templates/admin/submit_line.html
+++ b/django/contrib/admin/templates/admin/submit_line.html
@@ -1,5 +1,6 @@
{% load i18n admin_urls %}
<div class="submit-row">
+{% block submit-row %}
{% if show_save %}<input type="submit" value="{% trans 'Save' %}" class="default" name="_save">{% endif %}
{% if show_delete_link %}
{% url opts|admin_urlname:'delete' original.pk|admin_urlquote as delete_url %}
@@ -8,4 +9,5 @@
{% if show_save_as_new %}<input type="submit" value="{% trans 'Save as new' %}" name="_saveasnew">{% endif %}
{% if show_save_and_add_another %}<input type="submit" value="{% trans 'Save and add another' %}" name="_addanother">{% endif %}
{% if show_save_and_continue %}<input type="submit" value="{% trans 'Save and continue editing' %}" name="_continue">{% endif %}
+{% endblock %}
</div>
diff --git a/django/contrib/admin/templatetags/admin_list.py b/django/contrib/admin/templatetags/admin_list.py
index eeb56c0aa4..ff04faed94 100644
--- a/django/contrib/admin/templatetags/admin_list.py
+++ b/django/contrib/admin/templatetags/admin_list.py
@@ -19,6 +19,8 @@ from django.utils.safestring import mark_safe
from django.utils.text import capfirst
from django.utils.translation import gettext as _
+from .base import InclusionAdminNode
+
register = Library()
DOT = '.'
@@ -40,7 +42,6 @@ def paginator_number(cl, i):
i + 1)
-@register.inclusion_tag('admin/pagination.html')
def pagination(cl):
"""
Generate the series of links to the pages in a paginated list.
@@ -89,6 +90,16 @@ def pagination(cl):
}
+@register.tag(name='pagination')
+def pagination_tag(parser, token):
+ return InclusionAdminNode(
+ parser, token,
+ func=pagination,
+ template_name='pagination.html',
+ takes_context=False,
+ )
+
+
def result_headers(cl):
"""
Generate the list column headers.
@@ -314,7 +325,6 @@ def result_hidden_fields(cl):
yield mark_safe(form[cl.model._meta.pk.name])
-@register.inclusion_tag("admin/change_list_results.html")
def result_list(cl):
"""
Display the headers and data list together.
@@ -331,7 +341,16 @@ def result_list(cl):
'results': list(results(cl))}
-@register.inclusion_tag('admin/date_hierarchy.html')
+@register.tag(name='result_list')
+def result_list_tag(parser, token):
+ return InclusionAdminNode(
+ parser, token,
+ func=result_list,
+ template_name='change_list_results.html',
+ takes_context=False,
+ )
+
+
def date_hierarchy(cl):
"""
Display the date hierarchy for date drill-down functionality.
@@ -406,7 +425,16 @@ def date_hierarchy(cl):
}
-@register.inclusion_tag('admin/search_form.html')
+@register.tag(name='date_hierarchy')
+def date_hierarchy_tag(parser, token):
+ return InclusionAdminNode(
+ parser, token,
+ func=date_hierarchy,
+ template_name='date_hierarchy.html',
+ takes_context=False,
+ )
+
+
def search_form(cl):
"""
Display a search form for searching the list.
@@ -418,6 +446,11 @@ def search_form(cl):
}
+@register.tag(name='search_form')
+def search_form_tag(parser, token):
+ return InclusionAdminNode(parser, token, func=search_form, template_name='search_form.html', takes_context=False)
+
+
@register.simple_tag
def admin_list_filter(cl, spec):
tpl = get_template(spec.template)
@@ -428,7 +461,6 @@ def admin_list_filter(cl, spec):
})
-@register.inclusion_tag('admin/actions.html', takes_context=True)
def admin_actions(context):
"""
Track the number of times the action field has been rendered on the page,
@@ -436,3 +468,24 @@ def admin_actions(context):
"""
context['action_index'] = context.get('action_index', -1) + 1
return context
+
+
+@register.tag(name='admin_actions')
+def admin_actions_tag(parser, token):
+ return InclusionAdminNode(parser, token, func=admin_actions, template_name='actions.html')
+
+
+def change_list_object_tools(context):
+ """
+ Displays the row of change list object tools.
+ """
+ return context
+
+
+@register.tag(name='change_list_object_tools')
+def change_list_object_tools_tag(parser, token):
+ return InclusionAdminNode(
+ parser, token,
+ func=change_list_object_tools,
+ template_name='change_list_object_tools.html',
+ )
diff --git a/django/contrib/admin/templatetags/admin_modify.py b/django/contrib/admin/templatetags/admin_modify.py
index 50ec00bb25..95f0fc977c 100644
--- a/django/contrib/admin/templatetags/admin_modify.py
+++ b/django/contrib/admin/templatetags/admin_modify.py
@@ -3,10 +3,11 @@ import json
from django import template
from django.template.context import Context
+from .base import InclusionAdminNode
+
register = template.Library()
-@register.inclusion_tag('admin/prepopulated_fields_js.html', takes_context=True)
def prepopulated_fields_js(context):
"""
Create a list of prepopulated_fields that should render Javascript for
@@ -39,7 +40,11 @@ def prepopulated_fields_js(context):
return context
-@register.inclusion_tag('admin/submit_line.html', takes_context=True)
+@register.tag(name='prepopulated_fields_js')
+def prepopulated_fields_js_tag(parser, token):
+ return InclusionAdminNode(parser, token, func=prepopulated_fields_js, template_name="prepopulated_fields_js.html")
+
+
def submit_row(context):
"""
Display the row of buttons for delete and save.
@@ -66,6 +71,27 @@ def submit_row(context):
return ctx
+@register.tag(name='submit_row')
+def submit_row_tag(parser, token):
+ return InclusionAdminNode(parser, token, func=submit_row, template_name='submit_line.html')
+
+
+def change_form_object_tools(context):
+ """
+ Displays the row of change form object tools.
+ """
+ return context
+
+
+@register.tag(name='change_form_object_tools')
+def change_form_object_tools_tag(parser, token):
+ return InclusionAdminNode(
+ parser, token,
+ func=change_form_object_tools,
+ template_name='change_form_object_tools.html',
+ )
+
+
@register.filter
def cell_count(inline_admin_form):
"""Return the number of cells used in a tabular inline."""
diff --git a/django/contrib/admin/templatetags/base.py b/django/contrib/admin/templatetags/base.py
new file mode 100644
index 0000000000..a26a84d0de
--- /dev/null
+++ b/django/contrib/admin/templatetags/base.py
@@ -0,0 +1,31 @@
+from inspect import getfullargspec
+
+from django.template.library import InclusionNode, parse_bits
+
+
+class InclusionAdminNode(InclusionNode):
+ def __init__(self, parser, token, func, template_name, takes_context=True):
+ self.template_name = template_name
+
+ params, varargs, varkw, defaults, kwonly, kwonly_defaults, _ = getfullargspec(func)
+ if len(params) > 0 and params[0] == 'self':
+ params = params[1:] # ignore 'self'
+ bits = token.split_contents()
+ args, kwargs = parse_bits(
+ parser, bits[1:], params, varargs, varkw, defaults, kwonly, kwonly_defaults, takes_context, bits[0]
+ )
+ super().__init__(
+ func=func, takes_context=takes_context, args=args, kwargs=kwargs, filename=None
+ )
+
+ def render(self, context):
+ opts = context['opts']
+ app_label = opts.app_label.lower()
+ object_name = opts.object_name.lower()
+ self.filename = [
+ 'admin/%s/%s/%s' % (app_label, object_name, self.template_name),
+ 'admin/%s/%s' % (app_label, self.template_name),
+ 'admin/%s' % (self.template_name,),
+ ]
+
+ return super().render(context)