如何在 Django 视图的 ListView 中检查 POST 方法?我收到 405 错误

Mic*_*ian 0 python django django-forms django-views

这对我来说失败了。它给了我一个“405 方法不允许的错误”。它指的是POST方法是吗?如何检查 POST?或者我应该做一些完全不同的事情?

class StuffList(ListView):
    template_name = "list.html"
    queryset = Stuff.objects.all().order_by('-whatever')
    context_object_name = 'stuff'

    def get(self, request, *args, **kwargs):
        if request.POST:
            q = request.POST.get('q')
            stuff = Stuff.objects.filter(user__icontains=stuff)
            return render(request, self.template_name, {'stuff': stuff, 'q': q }) 
Run Code Online (Sandbox Code Playgroud)

在我的表单中,我将令牌放在表单操作中,如下所示:

  <form action="/stuff/" method="post" name="q">
     {% csrf_token %}
Run Code Online (Sandbox Code Playgroud)

Ant*_*ine 6

这是因为您正在发出 POST 请求,但您只定义了一个 GET 方法。如果添加 POST 方法,它应该可以解决问题:

def post(self, request, *args, **kwargs):
    stuff = request.POST.get('q')
    stuff = self.get_queryset().filter(user__icontains=stuff)
    return render(request, self.template_name, {'stuff': stuff, 'q': q })
Run Code Online (Sandbox Code Playgroud)

但是,如果您只是过滤列表,则使用 get 是正确的解决方案,在这种情况下,您必须将表单标记更改method="post"method="get"GET 方法,如下所示:

def get(self, request, *args, **kwargs):
    stuff = self.get_queryset()
    if request.GET.get('q'):
        q = request.GET.get('q')
        stuff = stuff.filter(user__icontains=q)
    return render(request, self.template_name, {'stuff': stuff, 'q': q }) 
Run Code Online (Sandbox Code Playgroud)

也许你应该看看 Django 表单,它可以进行数据验证、表单生成等等。
https://docs.djangoproject.com/fr/1.8/topics/forms/