DeleteView中的success_message未显示

Mag*_*gda 19 django django-class-based-views

我有一个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
Run Code Online (Sandbox Code Playgroud)

在我的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 %}
Run Code Online (Sandbox Code Playgroud)

但是没有显示该消息.我错过了什么吗?我在做什么?谢谢!

Hey*_*yl1 39

我认为Django问题跟踪器中的这个问题应该回答你的问题.

SuccessMessageMixinform_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)
Run Code Online (Sandbox Code Playgroud)

SuccessMessageMixin没有在删除视图中使用(但我将它用于创建和更新视图).希望这将在Django的更高版本中得到改进(有关详细信息,请参阅问题).

  • 如果super()。delete()中存在异常-例如,由于FK约束而无法删除该对象-这仍将显示成功消息,对吗?有没有办法在生成消息之前确认删除是否成功? (3认同)

Jos*_*ino 10

Hel1的答案大多是正确的,但不提供在成功消息中显示字段的解决方案,如下所示:

success_message = "Session %(name)s was removed successfully"
Run Code Online (Sandbox Code Playgroud)

只需获取要删除的对象并使用对象的字典格式化字符串,如下所示:

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)
Run Code Online (Sandbox Code Playgroud)


小智 5

from django.contrib import messages

class LectureDelete( DeleteView):
    model = Lecture

    def get_success_url(self):
        messages.success(self.request, "deleted successfully")
        return reverse("/")
Run Code Online (Sandbox Code Playgroud)