#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. Я уже позаботился об условном отображении сообщения об ошибке . Часть, которую мне очень не хватало, — это детали удаляемого объекта . Благодарен за ваш ответ. Спас мой день!!