【问题标题】:Clean request.POST object and checking if it is valid清理 request.POST 对象并检查它是否有效
【发布时间】:2019-12-01 08:30:42
【问题描述】:

我的 HTML 格式如下:

<form method="POST">
    {% csrf_token %}
    <button type='submit' name='manager_approve' value='{{ leave.leave_id }}' class='btn btn-success btn-md'>Approve</button>
</form>

在我看来,我正在按如下方式处理此请求:

class ProcessLeaveRequest(TemplateView):
    template_name = 'LMSAdmin/process_leave_request.html'

    def get(self, request, *args, **kwargs):
        return render(request, self.template_name, {'leave_requests': GetLeaves.process_results(request)})

    def post(self, request):

        if 'manager_approve' in request.POST:
            leave = Leaves.objects.get(id=request.POST['manager_approve'])

        return redirect('process_leave_request')

有没有办法在这个request.POST['manager_approve'] 上运行form 类的is_valid()cleaned_data() 函数而不创建form 对象?

【问题讨论】:

    标签: django django-forms django-class-based-views


    【解决方案1】:

    不,is_valid()cleaned_dataForm 对象的方法/属性,因此您必须创建一个表单。

    但是,如果您有一个模型,您可以创建该模型的一个实例并运行 clean() 来检查属性是否有效,尽管我认为这与您的用例不匹配,因为您只是传递了一个身份证。

    由于您的用例非常简单,如果没有传递 id 的 Leaves 对象,您可以通过捕获异常来避免 Form 事情:

    try: 
        leave = Leaves.objects.get(id=request.POST['manager_approve'])
    except (Leaves.DoesNotExist, ValueError, TypeError):
        # ValueError will be raised if id cannot be cast to int
        # TypeError will be raised if id is of wrong type
        raise Http404
    

    【讨论】:

    • 那么在不创建表单对象的情况下这样做是安全的吗?
    • 如果你把它保存到数据库中是不安全的,但是因为你只是在做一个get 并使用 ORM,Django 负责转换为 int,所以没有需要担心 SQL 注入。我认为用IntegerField 创建一个简单的表单并检查它是否有效仍然会更干净。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多