python - 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 %}
感谢您抽出宝贵的时间阅读,请帮助我,我真的需要这样做。
解决方案
默认情况下,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>
推荐阅读
- angular - Ionic 4 编译失败(角度 6)
- python - 如何使用 plotly 在气泡图上添加文本
- android - 平板电脑中的多桌面 (Android)
- android - 在android中调用videoview.seekTo()时无法播放视频流
- python - 无法设置字体大小和 rtl
- matlab - 使用 KNN 在 2D 中减小矩阵大小
- sql - 用分层数据类型查询表的更有效的 T-SQL 方法是什么
- c - 多项式操作
- asp.net - 为什么 DateTime.Now.TimeOfDay 不能作为手动时间设置?
- loops - 将现有文件分成多个文件,分别包含特定字段