diff options
| author | Raffaele Salmaso <raffaele@salmaso.org> | 2017-01-12 17:06:00 +0100 |
|---|---|---|
| committer | Carlton Gibson <carlton.gibson@noumenal.es> | 2018-02-28 08:49:40 +0100 |
| commit | 5cc28dc752c3ae78456bb835c3ba195489fc26d7 (patch) | |
| tree | dabc737b959f842c880d01542e48eb0dfe079cc5 /django | |
| parent | 6e52e2554dcc902b446f9d371ed1e6a07f36d6ec (diff) | |
Fixed #27728 -- Allowed overriding admin templatetags templates.
Diffstat (limited to 'django')
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 }}">‹ {{ 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) |
