如何在基于类的视图中调用自定义方法

时间:2018-07-30 18:13:19

标签: python django

我正在使用基于函数的视图,并且正在正确获取输出。 但是,当我在调用功能时将其更改为基于类的视图时,出现错误不允许使用方法(POST):

views文件”

class ChatBot(TemplateView):
    # extend from TemplateView
    template_name = 'bot/chatbot.html'
    //**Getting error in calling bot function**

class MessagePassing(View):
    def bot(request):
        response_data={}
        response_data['input'] = request.POST['message']
        return HttpResponse(json.dumps(response_data),
                        content_type="application/json")

2 个答案:

答案 0 :(得分:1)

使用def post(self, request):代替def bot(request)

self是必填参数。参考:What is the purpose of self?

使用post是因为bot不是有效的HTTP方法。类View希望将有效的HTTP方法名称用作方法名称。
参考1:Handling forms with Class Based Views
参考2:_allowed_methods

答案 1 :(得分:0)

这不是定义class-based views. (official-doc)的方法。

如果您想通过html视图接受HTTP POST请求,则必须在视图中将名为 MessagePassing 的方法定义为

post()

为什么 from django.views import View from django.http import HttpResponse class MessagePassing(View): def post(self, request, *args, **kwargs): # Change is here <<<< response_data = {} response_data['input'] = request.POST['message'] return HttpResponse(json.dumps(response_data), content_type="application/json") 方法不起作用?
收到适当的请求后,您的URL DIspatcher会将其传递到相应的视图(此处为bot()),而MessagePassing的{​​{3}}方法将检查请求的方法({{1 }})并传递到相应的方法MessagePassing。但是您没有定义POST方法。因此,它引发了post异常

因此,如果您想使用其他HTTP方法(例如get,put,patch等)访问视图,则必须手动将其定义为

post()