Как добавить пользовательскую кнопку в зарегистрированную модель в админке сайта django

Может ли кто-нибудь направить меня в правильном направлении, как разместить кнопку рядом с кнопкой удаления here? Я хочу разместить рядом с ней кнопку подтверждения и отказа, чтобы при нажатии на нее пользователю отправлялось письмо о том, что его/ее заявка принята или отклонена. Я искал решение в Интернете, а также прочитал несколько похожих вопросов здесь, но я не уверен, что это правильное решение.

Сначала сделайте кнопки подтверждения и отказа на странице list_page, написав метод confirmed() и denied(), затем вы добавляете ваши пользовательские url в admin urls, переопределив метод get_urls() и сопоставив эти url с методом представления confirmed_application() и denied_application().

После обработки вашей логики вы можете перенаправить ту же страницу списка изменений.

@admin.register(YourModel)
class YourModelAdmin(admin.ModelAdmin):
    list_display = ['your_model_fields', 'confirmed', 'denied']


    def confirmed(self, obj)
        url = reverse('admin:confirm_url', kwargs={'id': obj.id})
        return format_html('<a class="button" href="{}">Confirm</a>', url)

    def denied(self, obj)
        url = reverse('admin:denied_url', kwargs={'id': obj.id})
        return format_html('<a class="button" href="{}">Deny</a>', url)


    def get_urls(self):
        urls = super().get_urls()
        custom_urls = [
            path('confirm/<int:id>', self.confirmed_application, name='confirm_url'),
            path('deny/<int:id>', self.denied_application, name='denied_url'),
        ]
        return custom_urls + urls


    def confirmed_application(self, request, id):
        # you get object_id you can do whatever you want
        # you can send a mail

        # after processed all logic you can redirect same modeladmin changelist page
        redirect_url = "admin:{}_{}_changelist".format(self.opts.app_label, self.opts.model_name)
        return redirect(reverse(redirect_url))


    def denied_application(self, request, id):
        # same as  confirmed_application
        ...
Вернуться на верх