Как получить значение атрибута в представлениях
Здравствуйте, есть ли способ получить атрибут 'value' из HTML шаблона в views.py и использовать его там? HTML:
<form class="card__delete" method="POST"> {% csrf_token %}
<button value="{{item.id}}" class="card__delete__button" name="delete" type="submit">✘</button>
</form>
views.py
class TodoView(UserPassesTestMixin, CreateView):
model = Item
template_name = 'home/todo.html'
form_class = ItemCreationForm
def test_func(self):
return self.request.user.username in self.request.path
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['card'] = Card.objects.get(user=self.request.user, pk=self.kwargs.get('pk'))
return context
def post(self, request, pk, username):
if 'delete' in self.request.POST:
Item.objects.get(id=pk).delete()
print('deleted')
return redirect('home-page')
Значение находится в request.POST, поэтому вы должны иметь к нему доступ с помощью
value = self.request.POST.get('delete', None)
Перед тем, как использовать id объекта для совершения с ним катастрофических действий (например, .delete()
), проверьте это значение. Это значение не проверяется через форму, и случайный хакер в интернете может попытаться отправить обратно случайные числа, которые могут быть идентификаторами других объектов
Добавлено после прочтения комментария (по какой-то причине нажатие на добавить комментарий просто перезагружает страницу для меня 9 декабря 2021 года)
Данные, извлеченные из request.POST, являются необработанными данными. Я не думаю, что CSRF токен может защитить от человека, который использует объект inspect в своем браузере и изменяет значение этой кнопки перед тем, как нажать на нее. Я могу ошибаться.
В любом случае, если вы можете проверить значение с помощью набора запросов типа объекта с фильтром для объектов, которые этому пользователю разрешено удалять, то сделайте это. Например,
value = request.POST.get("delete", None)
if value:
obj = Whatever.objects.filter(
user=request.user ).get( pk=value)
# will raise WhateverDoesNotExist if value isn't one of user's objects,
# becaues it's been filtered out
obj.delete()
В настоящее время со StackOverflow творится что-то неладное. Я не могу видеть предварительный просмотр того, что я набираю.