Как отправить сообщение об ошибке на страницу подтверждения общего удаления Django с помощью JsonResponse

#django #error-handling #django-views #jsonresponse

#django #обработка ошибок #django-просмотры #jsonresponse

Вопрос:

Я пытаюсь использовать общее удаление Django, используя страницу подтверждения. Настройка работает так, как задумано.

Позже бизнес-логика была изменена, чтобы предотвратить удаление, если в модели есть дочерние экземпляры, назначенные удаляемому объекту on_delete=models.PROTECT .

И DeleteView он был изменен на следующий:

 class TerritoryDeleteView(LoginRequiredMixin, DeleteView):
    template_name = ".../trty_delete.html"
    model = Territory
    success_url = reverse_lazy('territories_list')

    # THE FOLLOWING MODIFICATION DONE:
    def delete(self, request, *args, **kwargs):
        self.object = self.get_object()
        try:
            self.object.delete()
            return HttpResponseRedirect(success_url)
        except ProtectedError:
            error_message = "This object can't be deleted, as an Outlet is already assigned to the Territory..."
            return JsonResponse(error_message, safe=False)
 

Приведенный выше (измененный) вид работает нормально. Однако, в случае, если он обнаруживает ProtectedError , error_message отображается на пустой странице браузера.

Как я могу отобразить error_message на самой странице подтверждения (шаблон)?

Комментарии:

1. Вы должны использовать render() функцию

2. @ArakkalAbu — Спасибо. Теперь можно увидеть сообщение. Но сведения об объекте (удаляемого объекта) теперь отсутствуют на странице. Например , если объект находится в Нижнем Манхэттене , его сведения доступны при первом Delete использовании опции (сделано для облегчения понимания пользователем). Теперь, когда приложение обнаруживает ProtectedError , эти данные полностью пропадают. Возможно, потому, что при исключении контекст передается не так, как в обычных случаях (т. Е. При отсутствии ошибки ). Что я должен сделать, чтобы постоянно сохранять контекстные данные на странице?

Ответ №1:

Сначала измените свой delete(...) метод, чтобы перехватить ProtectedError ошибку (что вы уже сделали), а затем передайте сообщение об ошибке в качестве контекстных данных в шаблон как

 class TerritoryDeleteView(LoginRequiredMixin, DeleteView):
    template_name = ".../trty_delete.html"
    model = Territory
    success_url = reverse_lazy('territories_list')

    def delete(self, request, *args, **kwargs):
        try:
            return super().delete(request, *args, **kwargs)
        except ProtectedError:
            self.object = self.get_object()
            context = self.get_context_data(
                object=self.object,
                error="Any error msg"
            )
            return self.render_to_response(context) 

Но этого недостаточно, мы также должны обновить файл шаблона.

 <form method="post">{% csrf_token %}
    {% if error %}
        {{ error }}
    {% else %}
        <p>Are you sure you want to delete "{{ object }}"?</p>
        <input type="submit" value="Confirm">
    {% endif %}

</form> 

Примечание: это может не совсем подходить для вашего случая, но, вероятно, это даст вам представление о том, как правильно управлять сообщением об ошибке.

Комментарии:

1. Я уже позаботился об условном отображении сообщения об ошибке . Часть, которую мне очень не хватало, — это детали удаляемого объекта . Благодарен за ваш ответ. Спас мой день!!