Как добавить кнопку рядом с кнопкой Добавить пользователя в Django Admin Site
Я работаю над проектом Django, где мне нужно извлечь список пользователей, чтобы преуспеть на экране пользователей Django. Я добавил переменную actions
в свой класс Sample для получения CheckBox перед каждым идентификатором пользователя.
class SampleClass(admin.ModelAdmin):
actions =[make_published]
Действие make_published уже определено. Теперь я хочу добавить еще одну кнопку рядом с кнопкой Add user
, как показано на рис.
. Но я не знаю, как я могу добиться этого, используя новый шаблон. Я хочу использовать эту кнопку для печати выбранных пользовательских данных. Спасибо, пожалуйста, направляйте меня.
Ответы
Ответ 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 немного противно и их следует избегать.