首页 > 解决方案 > 清理 request.POST 对象并检查它是否有效

问题描述

我在 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')

有没有办法在不创建对象的情况下运行类的功能is_valid()cleaned_data()功能?formrequest.POST['manager_approve']form

标签: djangodjango-formsdjango-class-based-views

解决方案


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

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

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

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

推荐阅读