Почему данные формы регистрации HTML не принимаются в django

У меня есть следующие конфигурации demo\urls.py, user\urls.py, views.py & HTML Form.

По-прежнему, когда я нажимаю кнопку отправки HTML-формы, она говорит, что файл не найден. Пользуясь помощью ChatGPT, который предоставил два решения, как указано в прикрепленном файле, даже тогда я получаю ошибку. Что делать

demo\urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('user', views.register),
]

user\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 & его ответ был следующим

Проблема, с которой вы столкнулись, скорее всего, связана с тем, как вы настроили шаблоны URL в Django. Давайте пройдемся по конфигурации и определим проблему:

Конфигурация URL:

У вас есть две различные конфигурации URL:

В demo/urls.py:

urlpatterns = [
    path('admin/', admin.site.urls),
    path('user', views.register),
]

В user/urls.py:

urlpatterns = [
    path('register', views.register),
]

Проблема заключается в том, что шаблон URL в demo/urls.py для представления register перехватывает URL /user, а шаблона для базового URL (/) нет. Поэтому при отправке формы действие указывает на {% url 'register' %}, который разрешается в /user, но форма отправляется в /user/register.

Действие формы:

В вашей HTML-форме атрибут action установлен в {% url 'register' %}, который будет преобразовываться в URL /user из-за конфигурации в demo/urls.py. Однако ваш фактический шаблон 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, в котором определено представление регистра.

Я попробовал оба предложения, но даже тогда я получаю Error

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, который предоставил два решения, как указано в прикрепленном файле, даже тогда я получаю ошибку.

Please don't use code you don't understand. That is true for codefragments you find online, but also for code fragments generated by ChatGPT. A paper named "How Secure is Code Generated by ChatGPT?" [arXiv] concluded that ChatGPT is aware of security vulnerabilities in the sense that if you ask about a vulnerability, it can explains the vulnerability, but does not take it into account when writing code. There are some small indications that chatbots like ChatGPT might provide a working example, but therefore that example is often not very good with respect to efficiency, security, architecture, etc.

Вернуться на верх