Создание форм, которые перенаправляют на другой URL при успешном выполнении

Вопрос или проблема

Я создал две папки (кроме основной папки проекта). Одна из моих папок – это основное приложение, а вторая – папка пользователей.


Сообщение об ошибке:

Страница не найдена (404)
Метод запроса: POST
URL запроса: http://127.0.0.1:8000/users/register
Используя URLconf, определенный в cooknook.urls, Django попытался найти следующие URL-шаблоны в этом порядке:

admin/

users/ register/ [name=”cooknook-register”]

[name=”cooknook-home”]

about/ [name=”cooknook-about”]

account/ [name=”cooknook-account”]

Текущий путь users/register не совпал ни с одним из этих.


^^ Выдана ошибка

Таким образом, в моем views.py, находящемся в папке пользователей, я указываю, что после успешной регистрации:

`

def register(response):
    if response.method == "POST":
        form = UserCreationForm()
        if form.is_valid():
            form.save()`
        
        return redirect('cooknook-home')


В общем, я уже пытался решить проблему и пытался реализовать функцию ‘reverse’, но это не сработало. Проблема в том, что, похоже, Django пытается найти URLs/html (шаблоны) внутри папки cooknookapp, которая является моей основной папкой приложения. Мне нужно, чтобы он перенаправлял на home.html (находящийся в основной папке приложения). Как мне заставить Django искать вне папки Users/?


register.html (внутри папки пользователей)

{% extends 'cooknookapp/base.html' %}

{% block title %}
    Создать аккаунт
{% endblock %}

{% block content %}
    <form method="POST" class="form-group">
        {{form}}
        <button type="submit" class-"btn-submit">Зарегистрироваться</button>
    </form>
{% endblock %}

urls.py основной папки cooknookapp:

> from django.urls import path from . import views
> 
> urlpatterns = [
>     path('', views.home, name="cooknook-home"),
>     path('about/', views.about, name="cooknook-about"),
>     path('account/', views.account, name="cooknook-account"), ]

urls.py папки пользователей (текущая папка):

> from django.urls import path from . import views
> 
> # Добавлен URL путь urlpatterns = [
>     path('register/', views.register, name="cooknook-register"), ]

Я ожидал, что меня перенаправят на главную страницу, которая находится в папке cooknookapp. Вместо этого он искал этот URL в папке users/, в которой находится написанный код. Если вам нужна дополнительная информация от меня, пожалуйста, дайте знать.

from django.shortcut import resolve_url
def register(response):
    if response.method == "POST":
        form = UserCreationForm()
        if form.is_valid():
            form.save()`
            return redirect(resolve_url('cooknook-home'))
        else:
            # неверное действие


Ответ или решение

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

Вот подробное руководство по правильной настройке:

Шаг 1: Проверьте ваши URL

Убедитесь, что у вас правильно определены URL для приложения users и основного приложения cooknookapp.

В файле urls.py вашего основного приложения (cooknookapp) добавьте URL для вашего приложения пользователей:

from django.urls import path, include
from . import views

urlpatterns = [
    path('', views.home, name="cooknook-home"),
    path('about/', views.about, name="cooknook-about"),
    path('account/', views.account, name="cooknook-account"),
    path('users/', include('users.urls')),  # Подключаем URL-адреса приложения users
]

Шаг 2: Проверьте файл urls.py в папке users

Ваш файл urls.py в папке users должен выглядеть следующим образом:

from django.urls import path
from . import views

urlpatterns = [
    path('register/', views.register, name="cooknook-register"),
]

Шаг 3: Исправление функции register в views.py

В вашем файле views.py в папке users убедитесь, что вы используете правильный импорт и создаете форму корректно:

from django.shortcuts import render, redirect
from django.contrib.auth.forms import UserCreationForm

def register(request):
    if request.method == "POST":
        form = UserCreationForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('cooknook-home')  # Это должно помочь
    else:
        form = UserCreationForm()

    return render(request, 'users/register.html', {'form': form})

Здесь мы добавляем request.POST в UserCreationForm, чтобы форма знала о данных, отправленных через POST-запрос. Если форма невалидна, она вернется на той же странице с формой и ошибками.

Шаг 4: Проверьте ваш шаблон register.html

Ваш шаблон register.html должен выглядеть следующим образом:

{% extends 'cooknookapp/base.html' %}

{% block title %}
    Создать аккаунт
{% endblock %}

{% block content %}
    <form method="POST" class="form-group">
        {% csrf_token %}
        {{ form.as_p }}  <!-- Это правильный способ рендеринга формы -->
        <button type="submit" class="btn-submit">Зарегистрироваться</button>
    </form>
{% endblock %}

Обратите внимание на добавление {% csrf_token %} для защиты от CSRF-атак.

Шаг 5: Проверьте настройки проекта

Убедитесь, что ваше приложение пользователей добавлено в INSTALLED_APPS в вашем файле settings.py:

INSTALLED_APPS = [
    ...,
    'users',
]

Заключение

После выполнения этих шагов ваше приложение должно корректно перенаправлять пользователей на домашнюю страницу (cooknook-home) после успешной регистрации. Если вы все еще получаете ошибку 404, проверьте в консоли, правильно ли загружаются URL, и убедитесь, что сервер Django работает.

Оцените материал
Добавить комментарий

Капча загружается...