Подтвердить что ты не робот

Добавьте пользовательскую кнопку на страницу администрирования приложения Django

У меня есть приложение в Django с подпрограммой, которая будет доступна только администратору. Я хочу добавить кнопку, чтобы выполнить процедуру в этом разделе приложения приложения admin.

Я должен создать шаблон для него, и если это так, как добавить шаблон html для приложения в админ. Или, может быть, есть команда просто добавить кнопку?

4b9b3361

Ответ 1

Общение с формами администратора может быть сложным, но я обычно обнаружил, что добавление ссылок, кнопок или дополнительной информации является простым и полезным. (Как список ссылок на связанные объекты без создания встроенного, esp для вещей, которые больше просматриваются, чем отредактированы).

От Django docs

Из-за модульного дизайна шаблонов администратора обычно ни необходимые, ни целесообразные замените весь шаблон. это почти всегда лучше переопределять раздел шаблона, который вы необходимо изменить.

Это добавит список в верхнюю часть формы.

Место в templates/admin/[your_app]/[template_to_override]:

{% extends "admin/change_form.html" %}

{% block form_top %}

{% for item in original.items %}
  {{ item }}
{% endfor %}

{% endblock %}

Ответ 2

Django1.10:

1) Переопределить admin/submit_line.html:

{% load i18n admin_urls %}
<div class="submit-row">
{% if extra_buttons %}
    {% for button in extra_buttons %}
        {{ button }}
    {% endfor %}
{% endif %}
{% 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 %}
    <p class="deletelink-box"><a href="{% add_preserved_filters delete_url %}" class="deletelink">{% trans "Delete" %}</a></p>
{% endif %}
{% 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 %}
</div>

Это предполагает, конечно, что button строковое представление является соответствующим элементом браузера input или button и помечено безопасным с помощью django.utils.safestring.mark_safe. В качестве альтернативы вы можете использовать фильтр шаблона safe или напрямую получить доступ к атрибутам button, чтобы построить <input>. На мой взгляд, лучше изолировать такие вещи до уровня python.

2) Переопределить MyModelAdmin.change_view:

def change_view(self, request, object_id, form_url='', extra_context=None):
    extra_context = extra_context or self.extra_context()
    return super(PollAdmin, self).change_view(
        request, object_id, form_url, extra_context=extra_context,
    )

Этот метод позволяет вам легко добавлять кнопки в любой ModelAdmin. В качестве альтернативы шагу (1) вы можете расширить admin/change_form.html и переопределить блок submit_row. Это будет немного более подробным из-за дополнительных тегов, необходимых в шаблоне.

Если вы хотите, чтобы дополнительные действия были доступны для всех ваших моделей (или определенного подмножества), тогда подкласс ModelAdmin с требуемой функциональностью (примером может быть добавление архивации в ваши модели. Вы даже можете добавить переопределение для удаления - и другие кнопки по умолчанию - так, что режим архивируется, а не удаляется, для этого потребуются некоторые модификации шаблонов)

Ответ 3

Вы также можете использовать django-admin-tools, что позволяет легко настроить начальную страницу администратора как панель инструментов. Используя LinkList, вы можете указать на некоторый метод просмотра и проверить, аутентифицирован ли пользователь. Это похоже на thies:

# dashboard.py (read more about how to create one on django-admin-tools docs)
class CustomIndexDashboard(Dashboard):
    """
    Custom index dashboard for captr.
    """
    def init_with_context(self, context):
        self.children.append(modules.LinkList(
            _('Tasks'),
            children=[
                ['Your task name', '/task']
            ]
        ))

# urls.py (mapping uri to your view function)
urlpatterns += patterns('yourapp.views',
    (r'^task$', 'task'),
)

# views.py
def task(request):
    if request.user.is_authenticated():
        update_definitions_task.delay() # do your thing here. in my case I'm using django-celery for messaging

    return redirect('/admin')

Ответ 4

Не связывайтесь со страницами администратора.

  • Создайте для этого "приложение". Да, ваша функция - это просто "рутина". Все в порядке. Многие более мелкие приложения - это хорошо.

  • Это приложение не имеет ничего нового в models.py. Нет новой модели. Нулевые строки кода.

  • Это приложение имеет полезный URL-адрес в urls.py. Что-то, что можно использовать для отображения этой страницы администратора. Один URL. Не много строк кода (менее десятка.)

  • Это приложение имеет одну функцию вида в views.py. В "GET" эта функция представления представляет собой форму. В "POST" эта функция просмотра выполняет "рутину". Это "сердце" вашего приложения. GET - конечно - просто возвращает шаблон для отображения. POST выполняет реальную работу и возвращает окончательный статус или что-то в этом роде.

Эта функция просмотра защищена декоратором, так что только администратор может ее выполнить. См. http://docs.djangoproject.com/en/1.2/topics/auth/#django.contrib.auth.decorators.user_passes_test. Вы хотите написать тест для администратора. lambda u: u.is_staff, вероятно, это.

  1. Это приложение имеет один шаблон, представленный GET и POST. Этот шаблон имеет форму с вашей кнопкой. Тот, который вы не можете легко добавить в админ.

  2. tests.py - это тестовый пример с двумя пользователями, тот, кто является администратором, и тем, кто не является администратором.

Не возиться со встроенными страницами администратора.