Почему я должен проверять ‘if id is not None’ в этом коде?

#python #django

#python #django

Вопрос:

Я следую руководству, озаглавленному «Необработанное представление на основе классов удаления», «Необработанное обновление», «Представление на основе списка» и «подробное представление на основе классов соответственно. Я понимаю все, кроме одного.

у course_list.html меня есть следующая ссылка:

 <a class="delete-btn" href="{% url 'courses:course-delete' obj.id %}">Delete</a>
  

Если пользователь нажмет и подтвердит удаление, он удалит этот курс из списка курсов.

Вопрос в том, почему инструктор проверяет if id is not None: ? даже если он опустит это из кода, он все равно будет работать нормально. Более того, вероятность того, что ‘id’ будет None, равна нулю, поскольку пользователь нажимает на форму, подобную приведенной ниже, и ссылка приведет пользователя к определенному маршруту, который в конечном итоге удалит этот конкретный курс. Пожалуйста, помогите мне понять это!

введите описание изображения здесь

Это код:

 class CourseDeleteView(View):
    template_name = "course/course-delete.html"

    def get_object(self):
        id = self.kwargs.get('id')
        obj = None
        if id is not None:  # why would he do that?
            obj = get_object_or_404(Course, id=id)
        return obj

    def get(self, request, id=None, *args, **kwargs):
        context = {}
        obj = self.get_object()
        if obj is not None:    # here, why checking obj for not None?
            context['object'] = obj
        return render(request, self.template_name, context)

    def post(self, request, id=None,  *args, **kwargs):
        context = {}
        obj = self.get_object()
        if obj is not None:  # and here
            obj.delete()
            context['object'] = None
            return redirect('/course/')
        return render(request, self.template_name, context)
  

Заранее благодарю

редактировать: urls.py

 app_name = 'courses'
urlpatterns = [
    path('courses/<int:id>/delete/',
         CourseDeleteView.as_view(), name='course-delete'),
]
  

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

1. Какой у вас URL?

2. Я только что добавил, что в вопросе

3. Здесь get_object_or_404 все имеет смысл, но я не думаю, что без id вы сможете проникнуть в свой код.

4. Я предполагаю, что если кто-то введет недопустимый URL id -адрес или попытается получить доступ к удаленному объекту, это защитит процедуры, потому что больше нет объекта для манипулирования — это приведет к возникновению ошибок. Конечно, питоновский способ сделать это — использовать » try / except » вместо if проверки.

5. @lucasgcb get_object_or_404 способен позаботиться об этом сценарии. если объект будет удален, он выдаст значение 404.

Ответ №1:

Я не думаю, что есть какая-либо причина для этого, если id is None тогда get_object_or_404 повысится Http404 .

В документации об этом ясно сказано:

Следующий пример получает объект с первичным ключом 1 из MyModel :

 from django.shortcuts import get_object_or_404

def my_view(request):
    obj = get_object_or_404(MyModel, pk=1)
  

Этот пример эквивалентен:

 from django.http import Http404

def my_view(request):
    try:
        obj = MyModel.objects.get(pk=1)
    except MyModel.DoesNotExist:
        raise Http404("No MyModel matches the given query.")
  

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

1. Спасибо, Жак Годен, да благословит вас Бог. Я буду игнорировать проверку id на отсутствие.

Ответ №2:

В целом, написание подобных условий является хорошей практикой, потому что вы хотите убедиться, что ваш код никогда не завершается сбоем. В веб-приложении это еще более важно, потому что URL-адреса могут быть доступны из любого места.

В этом конкретном примере вы правы, сам маршрут завершится ошибкой, если идентификатор отсутствует. Однако, если мы реструктурируем идентификатор, чтобы он был параметром запроса (например /courses/delete?id=x ), тогда эта часть кода становится необходимой.

По сути, это проверка работоспособности.