【问题标题】:Why the Django redirects url to undesired page为什么 Django 将 url 重定向到不需要的页面
【发布时间】:2020-02-27 05:22:23
【问题描述】:

我尝试在 Django(2.2 版)中进行用户注册。我可以运行本地服务器并填写注册表单,但是当我单击提交按钮时,会出现不同的重定向并且不会创建新用户。不是重定向到主页('/'),而是重定向到'accounts/register/register',我不知道为什么。谁能帮我找出问题所在。

在views.py 的早期,我使用了import User from django.contrib.auth.models 并更改了register.html 中的代码,但问题是一样的。也许我的 settings.py 有问题? 在 settings.py 我添加到 INSTALLED_APPS = ['users.apps.UsersConfig',] 并在最后 LOGIN_REDIRECT_URL = '/'

# views.py
from django.shortcuts import render, redirect
from django.contrib import messages
from django.contrib.auth.forms import UserCreationForm

def register(request):
    if request.method == "POST":
        form_register = UserCreationForm(request.POST)
        if form_register.is_valid():
            username = form_register.cleaned_data.get('username')
            messages.success(request, f'Account created for {username}!')
            return redirect('register/')
    else:
        form_register = UserCreationForm()
    return render(request, "registration/register.html", {'form_register': form_register})


# urls.py
from django.contrib import admin
from django.urls import path, include
from users.views import register

urlpatterns = [
    path('admin/', admin.site.urls),
    path('accounts/', include('django.contrib.auth.urls')),
    path('accounts/register/', register),]


# apps.py
from django.apps import AppConfig

class UsersConfig(AppConfig):
    name = 'users'


# register.html
<!doctype html>
<html>
<head>
    <title>Register</title>
</head>

<body>
    <form action="register" method="POST">
        {% csrf_token %}
        {{form_register.as_p}}
        <button type="submit">Register</button>
    </form>

    <div>
        {% for message in messages %}
        <h3> {{ message }} </h3>
        {% endfor %}
    </div>
</body>


</html>

【问题讨论】:

    标签: python django url redirect


    【解决方案1】:

    Django 不会重定向到任何地方。您的实际注册视图甚至没有被调用。

    您已将表单操作设置为“注册”。那是相对路径;由于您从“/accounts/register/”开始,它将被附加到该位置,这就是表单将提交到的位置。

    您应该执行以下操作之一:

    • 将完整路径放入表单中:action="/accounts/register/"
    • 更好的是,在 urls.py 中为 URL 模式命名:path('accounts/register/', register, name='register') 并使用 url 标签引用它:action="{% url 'register' %}"

    • 或者,只是将操作留空,在这种情况下,它将提交到同一页面,这就是您想要的:action=""

    【讨论】:

      【解决方案2】:

      感谢您的帮助。我用了你所有的建议,但我仍然有同样的问题。尝试注册新用户后,我在终端中有以下回复:

      Not Found: /accounts/register/register    
      [31/Oct/2019 20:18:40] "POST /accounts/register/register HTTP/1.1" 404 3847    
      Not Found: /favicon.ico    
      [31/Oct/2019 20:18:40] "GET /favicon.ico HTTP/1.1" 404 2335
      

      为了解决 favicon 的问题,我在 urls.py 中输入了

      from django.views.generic import RedirectView
      
      url_patterns=[
      
      path(r'^favicon\.ico$',RedirectView.as_view(url='/static/images/favicon.ico')),] 
      

      但它不起作用。最糟糕的问题是没有创建新用户。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        • 2023-03-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多