Добавьте пользовательскую кнопку на страницу администрирования приложения Django - PullRequest
19 голосов
/ 23 сентября 2010

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

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

Ответы [ 5 ]

13 голосов
/ 24 сентября 2010

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

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

Поместить в templates/admin/[your_app]/[template_to_override]:

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

{% block form_top %}

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

{% endblock %}
10 голосов
/ 05 октября 2016

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 с желаемой функциональностью (например, можно добавить архивирование в ваши модели. Вы даже можете добавить переопределение для удаления - и другие кнопки по умолчанию - чтобы режим был заархивирован, а не удален; для этого потребуются некоторые изменения шаблона)

2 голосов
/ 19 августа 2013

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

# 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')
0 голосов
/ 31 января 2018

Вы можете рассмотреть возможность добавления настраиваемого действия администратора для этого типа объекта (аналогично встроенному «delete»), если это необходимо. Некоторые преимущества включают в себя: «чистый Django», отсутствие необходимости связываться с шаблонами и возможность работать с несколькими объектами одновременно.

Администратор Django позволяет вам писать и регистрировать «действия» - просто функции, которые вызываются со списком объектов, выбранных на изменить страницу списка. Если вы посмотрите на любой список изменений в администраторе, вы увидеть эту функцию в действии; Django отправляет с пометкой «Удалить выбранное» Объекты »доступно для всех моделей.

https://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/

В этой статье я получил представление о том, как добавить кнопку настраиваемого действия, что является еще одним ответом. Хотя я смог обойтись более простыми встроенными действиями.

https://medium.com/@hakibenita/how-to-add-custom-action-buttons-to-django-admin-8d266f5b0d41

0 голосов
/ 23 сентября 2010

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

  1. Создайте для этого «приложение».Да, ваша функция - это просто «рутина».Это нормально.Много небольших приложений - хорошая вещь.

  2. В этом приложении нет ничего нового в models.py.Нет новой модели.Ноль строк кода.

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

  4. Это приложение имеет одну функцию просмотра в 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 - это тестовый пример с двумя пользователями, один из которых является администратором, а другой - не администратором.

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

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