@Bjornie
Изучаю Python

Как модифицировать шаблон в Django, не затрагивая верстки по умолчанию?

У меня есть пара вопросов по кастомизации шаблонов в Django.

1) Я разобрался с тем как меняется шаблон в целом, однако добавления строчки с (например) {% extends "admin/base_site.html" %} не хватает, и все что идет в шаблоне по умолчанию исчезает, если не скопировано в новый шаблон. Есть ли другой простой способ ДОБАВИТЬ в нужное место нужный мне код?

2) Другой вопрос: я хочу сделать кнопку только на странице определенной модели (в том же приложении). Как это сделать? По этой ссылке должно открываться новое окно, в котором будет пара полей и datepicker. В принципе я могу подключить спокойно jquery'-ui, и он все сделает что мне нужно. Но можно ли воспользоваться уже готовыми компонентами Django? Делается ли так?
  • Вопрос задан
  • 362 просмотра
Пригласить эксперта
Ответы на вопрос 2
Astrohas
@Astrohas
Python/Django Developer
У ModelAdmin есть свойство change_form_template . Укажите в нем файл шаблона для модели
Ответ написан
Assargin
@Assargin
Перед ответом смотрю наличие ✔ в ваших вопросах
1) Как это исчезает? В отнаследованном шаблоне всё остаётся как и есть в шаблоне-предке.
Т.е., если создать шаблон в проекте, и написать в нём лишь
{% extends 'admin/base_site.html' %}
то это будет, по сути, тот же самый шаблон.
Приведу пример из своего проекта, по нему вы сможете сориентироваться. Можно переопределять блоки, расширяя их (добавляя то, что нужно), или даже убирая контент из них.
Пример шаблона
{% extends 'admin/base_site.html' %}

{% load js_storage %}
{% load admin_static %}
{% load i18n %}
{% load pipeline %}


{% block extrastyle %}
    {{ block.super }}
    {% stylesheet 'Jcrop' %}
    {% stylesheet 'admin-core' %}
{% endblock %}

{% block extrahead %}
    {{ block.super }}
    {% js_storage_out %}
{% endblock %}

{# Из заголовка удалили конкретную для страницы крошку, оставив только site_title #}
{% block title %}{{ site_title|default:_('Django site admin') }}{% endblock %}

{# Добавили логотип #}
{% block branding %}
    <img src="{% static "images/logo_50.png" %}" class="logo" />
    {{ block.super }}
{% endblock %}

{# Убрали приветствие пользователя #}
{% block welcome-msg %}
{% endblock %}

{# Убрали ссылку View Site #}
{% block userlinks %}
    {% if user.is_active and user.is_staff %}
        {% url 'django-admindocs-docroot' as docsroot %}
        {% if docsroot %}
            <a href="{{ docsroot }}">{% trans 'Documentation' %}</a> /
        {% endif %}
    {% endif %}
    {% if user.has_usable_password %}
    <a href="{% url 'admin:password_change' %}">{% trans 'Change password' %}</a> /
    {% endif %}
    <a href="{% url 'admin:logout' %}">{% trans 'Log out' %}</a>
{% endblock %}

{% block footer %}
    {{ block.super }}
    {% javascript 'jquery-mousewheel' %}
    {% javascript 'js-cookie' %}
    {% javascript 'Jcrop' %}
    {% javascript 'plupload' %}
    {% javascript 'admin-core' %}
{% endblock %}

2) Кастомизировать шаблоны админки для конкретной модели можно, переопределяя их в папке шаблонов проекта. Например, если у меня есть приложение users, в нём есть модель user, и для неё мне нужно кастомизировать шаблон списка объектов, то я создаю файл templates/admin/users/user/change_list.html и делаю там, что мне нужно
Пример переопределения шаблона админки для модели
{% extends 'admin/change_list.html' %}

{% block extrahead %}
    {{ block.super }}
    <script type="text/javascript">
        var url = js_storage.url_users_user_show_user_password;
        (function($) {
            $(document).ready(function($) {
                $('#result_list td.field-rawpassword').click(function(event){
                    var $target = $(event.currentTarget);
                    var user_id = $target.closest('tr').find('td.action-checkbox input[type=checkbox]').val()
                    if(!$target.data('shown')){
                        $.get(url, {user_id: user_id}, function(data, status, xhr){
                            $target.html('<span style="font-family: Monospace">' + data.raw_password + '</span>');
                            $target.data('shown', true);
                        });
                    }
                });
            });
        })(django.jQuery);
    </script>
{% endblock %}

Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы