【问题标题】:How to get value attribute in views如何在视图中获取值属性
【发布时间】:2022-01-14 12:23:07
【问题描述】:

你好,有没有办法从 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')

【问题讨论】:

    标签: html django


    【解决方案1】:

    值在request.POST中,所以你应该可以访问它

    value = self.request.POST.get('delete', None)
    

    在使用对象的 id 对其执行任何灾难性的操作(例如 .delete())之前,请注意验证该值。它没有通过表单进行验证,互联网上的随机黑客可能会尝试发回可能是其他对象 id 的随机数

    阅读评论后补充:

    从 request.POST 中提取的数据是原始数据。我认为 CSRF 令牌不能防止在浏览器中使用检查对象并在单击该按钮之前更改该按钮的值的人。我可能错了。

    无论如何,如果您可以使用对象类型的查询集和过滤器来检查该用户被允许删除的对象的值,那么就这样做。例如,

    value = request.POST.get("delete", None)
    if value:
        obj = Card.objects.filter(
           user=self.request.user ).get( pk=value) 
        # will raise CardDoesNotExist if value isn't one of user's objects, 
        # because it's been filtered out
         obj.delete()
    

    【讨论】:

    • 但是我想删除这个项目。我该怎么办?我认为 {% csrf__token %} 会处理它。
    • @Kay 已编辑答案。 Firefox 出问题了,StackOverflow 使用 Chrome 恢复正常!
    猜你喜欢
    • 2017-07-24
    • 1970-01-01
    • 2019-12-24
    • 2017-08-20
    • 2012-03-05
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    相关资源
    最近更新 更多