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">×</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")