Success_message в DeleteView не показан

У меня есть DeleteView:

class LectureDelete(SuccessMessageMixin, DeleteView):
model = Lecture
success_message = "Die Veranstaltung wurde gelöscht"
success_url = '/'

def get_object(self):
    qs = super(LectureDelete, self).get_object()
    if self.request.user.has_perm('edit_lecture', qs):
        return qs
    else:
        raise exceptions.PermissionDenied

И в моем шаблоне, к которому ссылки success_url, у меня есть следующий код, который отлично работает с другими сообщениями:

{% if messages %}
        {% for message in messages %}
        <p class="alert alert-dismissable {% if message.tags %}alert-{{ message.tags }}"{% endif %}>
            <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
            {{ message }}
        </p>
        {% endfor %}
    {% endif %}

Но сообщение не отображается. Я что-то упускаю? Что я делаю? Спасибо!

Ответ 1

Я думаю, эта проблема в трекер-проблеме Django должна ответить на ваш вопрос.

SuccessMessageMixin привязывается к form_valid, который отсутствует в DeleteView, чтобы отправить свое сообщение пользователю.

Он также дает альтернативный способ, который работает для меня:

from django.views.generic.edit import DeleteView
from django.core.urlresolvers import reverse_lazy
from django.contrib import messages
from .models import Thing

class ThingDelete(DeleteView):
    model = Thing
    success_url = reverse_lazy('list')
    success_message = "Thing was deleted successfully."

    def delete(self, request, *args, **kwargs):
        messages.success(self.request, self.success_message)
        return super(ThingDelete, self).delete(request, *args, **kwargs)

SuccessMessageMixin не использовался в представлении delete (но я использую его для представлений Create and Update). Надеемся, что это будет улучшено в более поздних версиях Django (см. вопрос для получения дополнительной информации).

Ответ 2

Ответ Hel1 в основном верен, но не предлагает решения для отображения полей в сообщении об успешном завершении, например:

success_message = "Session %(name)s was removed successfully"

Просто удалите объект и отформатируйте строку с помощью словаря объектов, например:

class SessionDeleteView(SuccessMessageMixin, DeleteView):
    model = Session
    success_url = reverse_lazy('session_home')
    success_message = "Session %(name)s was removed successfully"

    def delete(self, request, *args, **kwargs):
        obj = self.get_object()
        messages.success(self.request, self.success_message % obj.__dict__)
        return super(SessionDeleteView, self).delete(request, *args, **kwargs)

Ответ 3

Похоже, вы используете структуру сообщений django в своем шаблоне, но не в своем представлении.

В вашем представлении попробуйте добавить сообщение об успешном завершении следующим образом:

from django.contrib import messages

messages.success(request, "Die Veranstaltung wurde gelöscht")