Добавьте пользовательскую кнопку на страницу администрирования приложения Django
У меня есть приложение в Django с подпрограммой, которая будет доступна только администратору. Я хочу добавить кнопку, чтобы выполнить процедуру в этом разделе приложения приложения admin.
Я должен создать шаблон для него, и если это так, как добавить шаблон html для приложения в админ. Или, может быть, есть команда просто добавить кнопку?
Ответы
Ответ 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
, вероятно, это.
-
Это приложение имеет один шаблон, представленный GET и POST. Этот шаблон имеет форму с вашей кнопкой. Тот, который вы не можете легко добавить в админ.
-
tests.py
- это тестовый пример с двумя пользователями, тот, кто является администратором, и тем, кто не является администратором.
Не возиться со встроенными страницами администратора.