Django. Групові дії у адмінці.

Основи Python и Django. -> Посилання у заголовку розділу.

Посилання у заголовку розділу.

Завдання.

Необхідно переопледілити шаблон і додати кнопку.

start page

документация

Дивимося, які є шаблони в базовому класі.

# Custom templates (designed to be over-ridden in subclasses)
add_form_template = None
change_form_template = None
change_list_template = None
delete_confirmation_template = None
delete_selected_confirmation_template = None
object_history_template = None
popup_response_template = None

Змінюємо.

...
class NewsLetterAdmin(admin.ModelAdmin):
    ...
    change_list_template = 'admin/newsletter_list.html'

Заберемо шаблон із оточення venv/lib/python3.6/site-packages/grappelli/templates/admin/change_list.html.

Додамо до нього кнопку.

...

{% block object-tools %}
    <ul class="grp-object-tools">
        <li><a href="{% url 'admin:create_news_letter' %}" class="grp-add-link grp-state-focus">Создать письмо</a></li>

...

Створюємо роут під урл та функцію-обробник.ку.

def create_news_letter(self, request):
    messages.success(request, 'Письмо создал')
    return redirect(reverse('admin:course_newsletter_changelist'))

def get_urls(self):
    from django.urls import path
    urls = super(NewsLetterAdmin, self).get_urls()
    myurl = [

        path('create/letter', self.admin_site.admin_view(self.create_news_letter), name="create_news_letter")
    ]
    return myurl+urls
Основи Python и 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, ]

start page

Прохід об’єктами.

 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'))