Как отправить сообщение об ошибке от Django DeleteView? - PullRequest
0 голосов
/ 31 января 2019

Допустим, есть две модели Parent и Child.От Parent до child является отношение один ко многим.

Я создаю модель DeleteView for Parent.Перед удалением мне нужно проверить, имеет ли Parent значение Children.Если нет Children, то модель Parent удаляется как обычно.Но если есть Children, тогда мне нужно отправить сообщение об ошибке на страницу подтверждения DeleteView.

Как мне добиться этого с помощью DeleteView?

Ответы [ 2 ]

0 голосов
/ 31 января 2019

DeleteView наследует DeletionMixin .Что вы можете сделать, это добавить on_delete=PROTECTED в вашу дочернюю модель и переопределить метод удаления в вашем представлении, чтобы перехватить исключение ProtectedError.Информацию об этом сообщении см. В фреймворке сообщений Django .

models.py:

class Child():
    #...
    myParent = models.ForeignKey(Parent, on_delete=PROTECTED)

views.py:

from django.db.models import ProtectedError

#...

class ParentDelete(DeleteView):
    #...
    def delete(self, request, *args, **kwargs):
        """
        Call the delete() method on the fetched object and then redirect to the
        success URL. If the object is protected, send an error message.
        """
        self.object = self.get_object()
        success_url = self.get_success_url()

        try:
            self.object.delete()
        except ProtectedError:
            messages.add_message(request, messages.ERROR, 'Can not delete: this parent has a child!')
            return # The url of the delete view (or whatever you want)

        return HttpResponseRedirect(success_url)
0 голосов
/ 31 января 2019

Вы можете переопределить метод delete и установить сообщение, используя Структура сообщений Джанго

from django.contrib import messages

class DeletePArent(DeleteView):

   # ...

   def delete(self, request, *args, **args):
       object = self.get_object()
       if object.chidlren.count() > 0:
           messages.add_message(request, messages.ERROR, "Can't be deleted, has childern")
           return redirect('url-of-your-choice')
       return super().delete(request, *args, **kwargs)  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...