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

How to check for a POST method in a ListView in Django views? I'm getting a 405 error

这对我来说失败了。它给了我一个“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 }) 

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

  <form action="/stuff/" method="post" name="q">
     {% csrf_token %}

这是因为您正在发出 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 })

但是,如果您只是过滤列表,使用 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 }) 

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