Как получить значение атрибута в представлениях

Здравствуйте, есть ли способ получить атрибут '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">&#10008</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 творится что-то неладное. Я не могу видеть предварительный просмотр того, что я набираю.

Вернуться на верх