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

Как добавить кнопку рядом с кнопкой Добавить пользователя в Django Admin Site

Я работаю над проектом Django, где мне нужно извлечь список пользователей, чтобы преуспеть на экране пользователей Django. Я добавил переменную actions в свой класс Sample для получения CheckBox перед каждым идентификатором пользователя.

class SampleClass(admin.ModelAdmin):
    actions =[make_published]

Действие make_published уже определено. Теперь я хочу добавить еще одну кнопку рядом с кнопкой Add user, как показано на рис. Admin User Screen. Но я не знаю, как я могу добиться этого, используя новый шаблон. Я хочу использовать эту кнопку для печати выбранных пользовательских данных. Спасибо, пожалуйста, направляйте меня.

4b9b3361

Ответ 1

  • Создайте шаблон в папке шаблона: admin/YOUR_APP/YOUR_MODEL/change_list.html
  • Поместите это в этот шаблон

    {% extends "admin/change_list.html" %}
    {% block object-tools-items %}
    
        {{ block.super }}
    
        <li>
            <a href="export/" class="grp-state-focus addlink">Export</a>
        </li>
    
    {% endblock %}
    
  • Создайте функцию просмотра в YOUR_APP/admin.py и закрепите ее аннотацией

    from django.contrib.admin.views.decorators import staff_member_required
    
    @staff_member_required
    def export(self, request):
    
        ... do your stuff ...
    
        return HttpResponseRedirect(request.META["HTTP_REFERER"])
    
  • Добавить новый url в YOUR_APP/admin.py в конфигурацию url для модели admin

    from django.conf.urls import patterns, include, url
    
    class YOUR_MODELAdmin(admin.ModelAdmin):
    
        ... list def stuff ...
    
        def get_urls(self):
            urls = super(MenuOrderAdmin, self).get_urls()
            my_urls = patterns("",
                url(r"^export/$", export)
            )
            return my_urls + urls
    

Наслаждайтесь;)

Ответ 2

Хотя другие ответы полностью верны, я думаю, важно отметить, что совершенно необязательно добавлять кнопку, чтобы получить такое поведение. Вы можете использовать действия администратора, как и для действия make_published.

Это как преимущество не требовать переопределения какого-либо шаблона и, таким образом, предотвращает потенциальные проблемы при обновлении версии django (поскольку шаблоны администратора могут меняться, а изменения могут быть несовместимы с тем, как вы его перевернули).

import csv

from django.http import HttpResponse
from django.utils import timezone

def export_as_csv(modeladmin, request, queryset):
    opts = modeladmin.model._meta
    filename = format(timezone.now(), "{app}_{model}-%Y%m%d_%H%M.csv").format(
        app=opts.app_label, model=opts.model_name)

    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename="{}"'.format(filename)

    writer = csv.writer(response)
    field_names = [f.get_attname() for f in opts.concrete_fields]
    writer.writerow(field_names)
    for obj in queryset.only(*field_names):
        writer.writerow([str(getattr(obj, f)) for f in field_names])

    return response

Для этого выполняются действия администратора, добавление пользовательской кнопки на один шаг ближе к "чрезмерной настройке", что означает, что, вероятно, время для написания ваших собственных просмотров.

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

Цитата из параграф введения документации Django Admin

Ответ 3

Простым и общепринятым способом является переопределение шаблона.

Если вы не хотите связываться с шаблонами Django, вы можете добавить класс Media к своему администратору и добавить javascript для создания кнопки, хотя я думаю, что создание элементов с javascript немного противно и их следует избегать.