我有以下 demo\urls.py、user\urls.py、views.py 和 HTML 表单的配置。
当我按下 HTML 表单的提交按钮时,它仍然显示“找不到文件”。借助 ChatGPT 的帮助,ChatGPT 提供了附加文件中提到的两个解决方案,即使这样我也收到错误。该怎么办
演示\urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('user', views.register),
]
用户\urls.py
urlpatterns = [
path('register', views.register),
]
views.py
def register(request):
if request.method == 'POST':
name = request.POST.get("name")
email = request.POST.get("email")
password = request.POST.get("password")
created_at = request.POST.get("created_at")
updated_at = request.POST.get("updated_at")
我在 HTML 表单中有以下代码
<form id="NewUser" method="POST" action="{% url 'register' %}">
{% csrf_token %}
<label for="name">Name:</label><br>
<input name="name" type="text" id="name" name="name"><br>
<label for="email">Email:</label><br>
<input name="email" type="email" id="email" name="email"><br>
<label for="password">Password:</label><br>
<input name="password" type="password" id="password" name="password"><br>
<script>
// Generate current datetime for Hidden fields
var current_datetime = new Date().toISOString();
document.getElementById('current_datetime').value = current_datetime;
</script>
<!-- Hidden fields for created_at and updated_at -->
<input type="hidden" name="created_at" value="{{ current_datetime }}">
<input type="hidden" name="updated_at" value="{{ current_datetime }}">
<button type="submit">Register</button>
</form>
</body>
</html>
当我按下 HTML 表单的提交按钮时,它显示“未找到文件”。错误是什么以及如何修复它
我使用过ChatGPT & 他的回复如下
您遇到的问题可能是由于您在 Django 中配置 URL 模式的方式造成的。让我们检查一下配置并找出问题:
网址配置:
您有两种不同的 URL 配置:
在 demo/urls.py 中:
urlpatterns = [
path('admin/', admin.site.urls),
path('user', views.register),
]
在 user/urls.py 中:
urlpatterns = [
path('register', views.register),
]
这里的问题是 demo/urls.py 中注册视图的 URL 模式正在捕获 URL /user,而基本 URL (/) 没有模式。因此,当您提交表单时,操作指向 {% url 'register' %},它解析为 /user,但表单正在提交到 /user/register。
表单操作:
在 HTML 表单中,action 属性设置为 {% url 'register' %},由于 demo/urls.py 中的配置,该属性将解析为 URL /user。但是,注册视图的实际 URL 模式是 /user/register,如 user/urls.py 中所定义。
解决方案:
您有多种选择来解决此问题:
更新 HTML 模板中的表单操作以直接指向 /user/register:
或者,您可以修改 URL 配置以与您的应用程序结构保持一致:在 demo/urls.py 中:
from django.urls import include
urlpatterns = [
path('admin/', admin.site.urls),
path('user/', include('user.urls')), # Include user URLs
]
在 user/urls.py 中:
urlpatterns = [
path('register/', views.register), # Add a trailing slash
]
通过此设置,HTML 模板中的表单操作可以保留为 {% url 'register' %},并且它将正确解析为 /user/register。
选择最适合您的应用程序结构和偏好的方法。无论哪种方式,请确保表单操作与定义注册视图的 URL 模式匹配。
我已经尝试了这两种建议,即使这样我也遇到了错误
Not Found: /
[04/Apr/2024 00:42:20] “GET / HTTP/1.1” 404 2162
Not Found: /cart.json
[04/Apr/2024 00:42:20] “GET /cart.json HTTP/1.1” 404 2207
Not Found: /
[04/Apr/2024 00:42:21] “GET / HTTP/1.1” 404 2162
Not Found: /cart.json
[04/Apr/2024 00:42:21] “GET /cart.json HTTP/1.1” 404 2207
[04/Apr/2024 00:42:25] “GET /admin/user/userprofile/ HTTP/1.1” 200 4977
[04/Apr/2024 00:42:25] “GET /admin/jsi18n/ HTTP/1.1” 200 3195
Not Found: /cart.json
[04/Apr/2024 00:42:26] “GET /cart.json HTTP/1.1” 404 2207
如何解决这个问题,以便表单数据应该转到 django 预先感谢
我怀疑您没有渲染模板,因此
{% url 'register' %}
不是插值,而是action="…"
的值,因此不将数据发送到服务器。
因此,您可以将模板保存在
user/templates/user/register.html
中(第一个 user
是应用程序的目录)。模板看起来像:
<!-- user/templates/user/register.html -->
<html>
<body>
<form id="NewUser" method="POST" action="{% url 'register' %}">
{% csrf_token %}
<label for="name">Name:</label><br>
<input name="name" type="text" id="name" name="name"><br>
<label for="email">Email:</label><br>
<input name="email" type="email" id="email" name="email"><br>
<label for="password">Password:</label><br>
<input name="password" type="password" id="password" name="password"><br>
<button type="submit">Register</button>
</form>
</body>
</html>
现在我们为
register
函数提供一个名称,例如:
# demo/urls.py
from django.urls import include, path
urlpatterns = [
path('admin/', admin.site.urls),
path('user/', include('user.urls')),
]
# user/urls.py
from user.views import register
urlpatterns = [
path('register/', register, name='register'),
]
在视图中,我们渲染:
# user/views.py
from django.shortcuts import render
def register(request):
if request.method == 'POST':
name = request.POST.get('name')
email = request.POST.get('email')
password = request.POST.get('password')
return render(request, 'user/register.html')
为了查看表单,不仅要POST它,我们还访问
localhost:8000/user/register
(没有.html
,并以8000
作为端口)。
这将插入模板,从而将
{% url 'register' %}
替换为/user/register/
。
从 ChatGPT 获取帮助,它提供了附件中提到的两个解决方案,即使这样我也收到错误。
请不要使用您不理解的代码。对于您在网上找到的代码片段来说是这样,对于 ChatGPT 生成的代码片段也是如此。一篇名为 “ChatGPT 生成的代码如何安全?” [arXiv] 的结论是,ChatGPT 能够意识到安全漏洞,即如果您询问某个漏洞,它可以解释该漏洞,但不会解释该漏洞。编写代码时考虑到这一点。有一些小迹象表明,像 ChatGPT 这样的聊天机器人可能会提供一个可行的示例,但因此该示例在效率、安全性、架构等方面通常不是很好。