如何在基于类的视图上处理不同的POST请求?

时间:2017-03-03 17:24:42

标签: python django

我正在使用Django,直到现在我只需要为页面提供单个POST请求,但现在我需要发出多个POST请求,而且我不需要知道如何使用相同的方法处理不同的POST请求。

也许我没有很好地解释我。

我有一个像。

的view.py
class List(View):
    def post(self, request):
        #Receive the JSON
        return JsonResponse(data,safe=False) #data is a list of dicts []

    def get(self,request):
        return  render(request,'list.html')
list =List.as_view()

现在,我将返回信息以创建元素列表,并且每个元素都有一个按钮,用于打开模式,我想要显示更多信息。问题是,我可以使用我所拥有的post方法发送所需的所有信息,但是如果没有全部信息可以使用,我不认为在一个请求中发送太多信息是正确的。

所以,我的想法是按钮首先为我需要的数据发出新的POST请求,然后用它创建模态。我的问题是我不知道如何处理第二个请求,因为理论上,如果我发送另一个请求,将由我所拥有的post()方法处理,并且它不会返回我需要的信息,那么,如何处理第二个请求?有没有办法创建另一个方法post()来处理其他请求?或者我如何使post()区别于提出了哪个请求?

更新 为了解决这个问题,我使用JS中的JSON发送了一个值

data: {
    csrfmiddlewaretoken : csrftoken,
    value : nemp,
    second: "second"
}

我只需要查看视图if request.POST.has_key('second'):以确定是第一个请求还是第二个请求。这是一种非常好的方式,但它确实有效。如果有人知道另一种方法,那就不要怀疑了。

1 个答案:

答案 0 :(得分:0)

您可以使用唯一网址创建另一个视图,或者基本上按照您的建议进行操作。贝娄是一个更干净的实现同样的事情:

class List(View):
    def post(self, request, *args, **kwargs):
        method = getattr(self, 'step_' + request.POST.get('step', ''), self.step_1)
        return method(request, *args, **kwargs)

    def step_1(self, request, *args, **kwargs):
        pass

    def step_2(self, request, *args, **kwargs):
        pass

默认情况下执行step_1()方法,POST参数step_2()step时执行2。你可以随意扩展它。

虽然我不确定“一个请求中的数据太多”确实是你应该关注的事情。如果您的意思是“我不想立即向用户询问太多信息,那么我可能会将其分解为几步”。