为什么 django 中收不到 HTML 注册表数据

问题描述 投票:0回答:1

我有以下 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 预先感谢

html django forms django-rest-framework django-views
1个回答
1
投票

我怀疑您没有渲染模板,因此

{% 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 这样的聊天机器人可能会提供一个可行的示例,但因此该示例在效率、安全性、架构等方面通常不是很好。

© www.soinside.com 2019 - 2024. All rights reserved.