Выбор правильного подхода Django для удаления вида - PullRequest
0 голосов
/ 08 мая 2019

Я работаю над сайтом Django, и у меня есть проблема в поиске правильного / хорошего способа обработки представления удаления.Из того, что я обнаружил, есть два способа приблизиться к этому:

1

class ObjectDeleteView(DeleteView):

    model = Object
    def get_success_url(self):
        objectid = self.kwargs['object_id']
        object = Object.objects.get(id = objectid)
        container = object.container
        containerid = container.id
        url = reverse('Containers:showContainerContent', args=[containerid])
        return url 
    def get_object(self):
        return get_object_or_404(Object, pk=self.kwargs['object_id'])

2

def objectDelete(request, object_id):
    object = Object.objects.get(id = object_id)
    container = object.container
    containerid = container.id
    url = reverse('Containers:showContainerContent', args=[containerid])
    return HttpResponseRedirect(url)

Из того, что я могу сказать, оба делают абсолютно одинакововещь - как только объект удален, данный пользователь со страницей в разделе «Контейнеры»: showContainerContent.

Большая разница, с которой я сталкиваюсь, - это ошибка, которую я получаю при запуске модульного теста для этого (простой вызов веб-сайта и проверка кода ответа),С опцией 1 я получаю ошибку

django.template.exceptions.TemplateDoesNotExist: ContainerApp/object_confirm_delete.html

Что я понимаю - у меня нет этого шаблона, это шаблон по умолчанию для DeleteView, следовательно, ошибка верна.Дело в том, что я не хочу иметь дополнительную страницу.Просто перенаправьте пользователя и все.

Кроме того, я протестировал изменение return url на return HttpResponseRedirect(url) в варианте 1, но результат тот же.

Что мне здесь делать?Должен ли я просто продолжить с вариантом 2?Каковы или могут быть недостатки этого подхода?

1 Ответ

1 голос
/ 08 мая 2019

Существует существенное различие между двумя представлениями удаления на основе классов и представлением на основе функций (способ, которым вы его объявили).

CBV принимает get, post и delete http методы.Когда вы отправляете запрос get в представление на основе классов, он не удаляет объект.Вместо этого он отображает шаблон с объектом, который будет удален в контексте.Это в основном используется для подтверждения.Например, вы можете отправить запрос на получение, и он отобразит шаблон с текстом «Вы действительно хотите удалить?»или "Пожалуйста, подтвердите, бла-бла ..".И если вы отправите запрос post или delete, он фактически удалит объект и перенаправит на следующую страницу.

FBV , с другой стороны, даст вам полный контроль надчто ты хочешь делать.И, как вы объявили, он примет любой тип запроса, удалит объект и перенаправит на следующую страницу, потому что вы не сделали никакой проверки типа запроса, что не является хорошей идеей, IMHO.Вы не должны разрешать удаление при получении запросов.Они должны быть идемпотентными.CBV предлагает множество других вещей.Например, в случае, если объект не существует, ваш FBV потерпит крах.CBV, напротив, вернет правильный ответ 404. Если объект не существует.

Так что я думаю, что использование FBV не так уж и плохо, но make достаточно силен и безопасен, чтобы справляться с каждым случаем (что, если объект делаетне существует ?, а как насчет подтверждения ?, GET должен быть идемпотентным, разрешать удаление только с постом? и т. д. и т. д.).Или просто используйте CBV.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...