首页 > 解决方案 > Django 无法搜索“方法不允许”

问题描述

我是 django 的新手,我目前正在为我的朋友做一个网站。他要我做一个系统,用户可以搜索数据库,网站根据他们的序列号给出相关项目。我遵循以下站点的教程:https ://learndjango.com/tutorials/django-search-tutorial弄清楚如何进行数据库搜索,这很有帮助,但我仍然遇到问题:我的搜索栏有效,并且结果页面也有效,但仅当我自己在搜索栏上手动键入查询时才有效(例如结果/?q = number1)。但是,当我使用输入栏和提交按钮进行搜索时,它会将我发送到 /results/ 页面,页面给出了以下信息:

此页面不工作

如果问题仍然存在,请联系网站所有者。

HTTP 错误 405

- 当我打开 pycharm 以查看终端中的错误时,它说:

Method Not Allowed (POST): /result/

Method Not Allowed: /result/

[27/Oct/2020 20:06:02] "POST /result/ HTTP/1.1" 405 0

这是我的代码(python3.7,pycharm)网站/网址:

from . import views
from django.urls import path
from django.contrib.auth import views as auth_views

urlpatterns = [
    path('register/',views.UserFormView.as_view(), name='register'),
    path('login/', auth_views.LoginView.as_view(), name='login'),
    path('', views.IndexViews.as_view(), name='index'),
    path('scan/', views.ScanView.as_view(), name='scan'),
    path('result/', views.SearchResultsView.as_view(), name='result'),
]

网站/观点:

class IndexViews(generic.ListView):
    template_name = "websites/index.html"
    context_object_name = "object_list"

    def get_queryset(self):
        return Website.objects.all()


class ScanView(TemplateView):
    form_class = SerialFrom
    template_name = 'websites/scan.html'


class SearchResultsView(ListView):
    model = SerialNumber
    template_name = 'websites/result.html'

    def get_queryset(self):  # new
        query = self.request.GET.get('q')
        context = self.get_context_data(object=self.object)
        object_list = SerialNumber.objects.filter(
            Q(number__iexact=query)
        )
        return object_list

扫描.html:

 {% extends 'websites/base.html' %}
{% block albums_active %}active{% endblock %}

{% block body %}
<head>
    <meta charset="UTF-8">
    <title>Scan</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <form class="box" action="{% url 'result' %}" method="POST">
      <h1>Product Check</h1>
        <p> Please enter the serial id of your product to check it.</p>
      {% csrf_token %}
      <input type="text" name="q" placeholder="Serial Number">
      <input type="submit" name="q" placeholder="Check">
  </form>
</body>
{% endblock %}

感谢您抽出宝贵的时间阅读,请帮助我,我真的需要这样做。

标签: pythonhtmldjangourlredirect

解决方案


默认情况下,ListView[Django-doc]不实现 POST 请求的处理程序。搜索通常通过 GET 请求完成,因此您应该使用:

<form class="box" action="{% url 'result' %}" method="GET">
    <h1>Product Check</h1>
    <p> Please enter the serial id of your product to check it.</p>
    <input type="text" name="q" placeholder="Serial Number">
    <input type="submit" placeholder="Check">
</form>

此外,<input type="submit">不应该有一个name="q"属性。

正如@Melvyn 所说,您还可以将文本框的类型更改为type="search"[mozilla] :

<form class="box" action="{% url 'result' %}" method="GET">
    <h1>Product Check</h1>
    <p> Please enter the serial id of your product to check it.</p>
    <input type="search" name="q" placeholder="Serial Number">
    <input type="submit" placeholder="Check">
</form>

推荐阅读