Дополнительное поле отображается вне таблицы в представлении admin change_list - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть модель с именем Project в приложении под названием projects, которое я зарегистрировал на сайте администратора, чтобы экземпляры можно было добавлять / редактировать / и т.д.Это работает как ожидалось.Теперь я хочу добавить кнопку для каждого проекта в представлении списка изменений на сайте администратора, которая ссылается на пользовательскую форму, для выполнения которой требуется экземпляр Project.Я выполнил кучу разных уроков по настройке сайта администратора и сумел добавить еще одно поле в таблицу представления списка изменений.Однако записи отображаются вне таблицы (см. Изображение).Broken table format of admin change list view

Я добавил пользовательское поле, переписав шаблон admin/change_list.html и вызвав внутри него тег пользовательского шаблона custom_result_list.Этот тег добавляет поле таблицы в список изменений и затем вызывает шаблон admin/change_list_results.html, чтобы отобразить его.Я подтвердил с помощью отладчика, что элемент добавляется в записи списка изменений до отображения шаблона (см. Изображение). list of variables in a debug window

Я не могу объяснить, почему таблицане отображается правильно, хотя дополнительное поле имеет ту же структуру, что и автоматически сгенерированные.Я должен признать, что прибегал к программированию Cargo Cult, потому что я не понимаю, как это должно работать, несмотря на то, что трачу слишком много времени на решение этой простой проблемы.

Вот соответствующий код.

В файле /projects/templatetags/custom_admin_tags.py:

from django import template
from django.contrib.admin.templatetags.admin_list import result_list as admin_result_list

def custom_result_list(chl):
    extended_cl = {}
    extended_cl.update(admin_result_list(chl))

    extended_cl["result_headers"].append({
        'class_attrib': r' class="column-__str__"',
        'sortable': False,
        'text': 'Configure Project'
    })

    idx = 0
    snippet = '<td class="action-button"><a href="/admin/projects/project_admin/{}">{}</a></td>'
    for project in chl.result_list:
        extended_cl["results"][idx].append(snippet.format(project.id, project.unmod_name))
        idx += 1
    return extended_cl

register = template.Library()
register.inclusion_tag('admin/change_list_results.html')(custom_result_list)

В файле templates/admin/projects/project/change_list.html:

{% extends "admin/change_list.html" %}
{% load i18n admin_urls static admin_list %}
{% load custom_admin_tags %}

{% block result_list %}
    {% if action_form and actions_on_top and cl.show_admin_actions %}{% admin_actions %}{% endif %}
    {% custom_result_list cl %}
    {% if action_form and actions_on_bottom and cl.show_admin_actions %}{% admin_actions %}{% endif %}
{% endblock %}

1 Ответ

0 голосов
/ 18 февраля 2019

Чтобы решить вашу проблему:

from django.utils.html import format_html

замените snippet.format(...) на format_html(snippet,...)

Объяснение:

в django, всестроки, которые вы передаете из python, автоматически экранируются HTML.что означает, что все ваши теги не будут рассматриваться как HTML.Такое ограничение добавлено, чтобы избежать любых возможных взломов хакерами.В вашем случае настоятельно рекомендуется использовать шаблон для рендеринга HTML.Однако вы также можете отправить необработанный HTML-код из Python, используя вспомогательную функцию format_html .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...