Почему в этом коде я должен проверить «если id не None»? - PullRequest
2 голосов
/ 15 апреля 2019

Я следую учебному пособию под названием Raw Delete Class Based View, Raw Update, list и detail View Based View соответственно. Я понимаю все, кроме одного.

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

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

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

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

enter image description here

Это код:

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'),
]

Ответы [ 2 ]

2 голосов
/ 15 апреля 2019

Не думаю, что для этого есть какая-либо причина, если id равно 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.")
0 голосов
/ 15 апреля 2019

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

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

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

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