【问题标题】:Django can't search "method not allowed"Django 无法搜索“方法不允许”
【发布时间】:2021-02-10 00:56:58
【问题描述】:

我是 django 的新手,我目前正在为我的朋友做一个网站。他想让我做一个系统,用户可以搜索数据库,网站根据他们的序列号给出相关项目。 我遵循以下站点的教程:https://learndjango.com/tutorials/django-search-tutorial 弄清楚如何进行数据库搜索,这很有帮助,但我仍然遇到问题:我的搜索栏有效,结果页面也有效,但只有当我手动时才有效自己在搜索栏上输入查询(例如 results/?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

scan.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 %}

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

【问题讨论】:

  • 使用 GET 而不是 POST 进行搜索的原因是,搜索不会改变应用程序或其数据库中的任何内容。它与列表 (ListView) 相同,只是它为用户提供了将列表中的项目减少为更相关的选项。

标签: python html django url redirect


【解决方案1】:

默认情况下,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>

此外,&lt;input type="submit"&gt; 不应具有 name="q" 属性。

作为@Melvyn says,您还可以将文本框的类型更改为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>

【讨论】:

  • 使用type="search" 进行特定于浏览器的增强并且在语义上更准确。不过,这只是一个微小的区别。
  • 非常感谢!经过一整天的搜索,我终于做到了!
  • @tyler:您是否从按钮中删除了name="q"?如果没有,它会(可能)在末尾添加一个额外的&amp;q=,因此q 对象将为空。
猜你喜欢
  • 2018-12-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-23
  • 1970-01-01
  • 2017-07-16
  • 2016-05-08
  • 2021-04-05
  • 2018-05-30
相关资源
最近更新 更多