如何在 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/
这对我来说失败了。它给了我一个“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/