Basics of Python and Django. / Django. Групповые действия в админке. / Групповые действия в админке.
Групповые действия в админке.
Создаем функцию для действия.
def create_letter(modeladmin, request, queryset):
pass
create_letter.short_description = 'Create a news letter'
@admin.register(Lesson)
class LessonAdmin(admin.ModelAdmin):
...
actions = [create_letter, ]
Проход по объектам.
def create_letter(modeladmin, request, queryset):
for lesson in queryset:
print(lesson)
Вывод сообщения о результате.
from django.contrib import messages
def create_letter(modeladmin, request, queryset):
for lesson in queryset:
print(lesson)
messages.add_message(request, messages.INFO, 'A letter has been created!')
Пример создания записи и присвоения обьектов в связке многие-ко-многим.
from django.contrib import messages
from .models import NewsLetter
def create_letter(modeladmin, request, queryset):
try:
l = NewsLetter.objects.get(title='News')
except:
l = NewsLetter()
l.title = 'News'
l.save()
for lesson in queryset:
l.lesson.add(lesson)
messages.add_message(request, messages.INFO, 'A letter has been created!')
Ссылка в списке.
Создаем метод-обработчик в классе админки.
class NewsLetterAdmin(admin.ModelAdmin):
...
def send_news_letter(self, request, letter_id):
lesson = NewsLetter.objects.get(pk=letter_id)
messages.success(request, 'Письма разослал')
return redirect(reverse('admin:course_newsletter_changelist'))
Добавляем дополнительнй роутинг к классу админки.
class NewsLetterAdmin(admin.ModelAdmin):
...
def get_urls(self):
from django.urls import path
urls = super(NewsLetterAdmin, self).get_urls()
myurl = [
path('send/letter/<int:letter_id>', self.admin_site.admin_view(self.send_news_letter), name="send_news_letter")
]
return myurl+urls
Делаем функцию, выводящую ссылку и добавляем ее в list_display.
from django.urls import reverse
from django.utils.safestring import mark_safe
....
class NewsLetterAdmin(admin.ModelAdmin):
list_display = ['title','send_letter_link']
def send_letter_link(self, obj):
url = reverse('admin:send_news_letter',args=[obj.id])
return mark_safe('<a href="%s">%s</a>' % (url, 'Send the letter'))