#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
), тогда эта часть кода становится необходимой.
По сути, это проверка работоспособности.