【问题标题】:Url getting duplicated in django: sign/sign/django 中的 URL 重复:sign/sign/
【发布时间】:2021-05-24 18:46:21
【问题描述】:

sign/ url 自身重复,如下图所示。如何停止此 url 重复?在接受用户输入之前它工作正常。当用户点击提交按钮时,它会在 url 中复制自身。

这是 View.py

from django.http import HttpResponse 
# Create your views here.

def Home(response):
    return render(response, "main/index.html",{}) 

def sign_up_in(response):
    if response.method == 'POST':
        email = response.POST.get('eemail') 
        print(email)                         
    return render(response, "main/sign_up_in.html",{})    

这是 urls.py


from . import views
urlpatterns = [
   path("", views.Home, name = "Homes"), 
   path("sign/", views.sign_up_in, name = "sign_up_in") 
]

这是 urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include("main.urls")),
    path('sign/', include("main.urls")),
]

这是我的 sign_up_in.html 代码

                <form method="POST" class="form" id="a-form" action="{% url 'sign_up_in' %}">
                    {% csrf_token %}
                    <h2 class="form_title title">Create Account</h2>
                    <div class="form__icons"><img class="form__icon" src="svg_data" alt=""><img class="form__icon" src="svg_data"><img class="form__icon" src="svg_data"></div><span class="form__span">or use email for registration</span>
                    <input class="form__input" type="text" placeholder="Name" name="eemail">
                    <input class="form__input" type="text" placeholder="Email">
                    <input class="form__input" type="password" placeholder="Password">
                    <button class="button" type="submit">SIGN UP</button>
                </form>
           
                <form method="POST" class="form" id="b-form" action="">
                    {% csrf_token %}
                    <h2 class="form_title title">Sign in to Website</h2>
                    <div class="form__icons"><img class="form__icon" src="svg_data" alt=""><img class="form__icon" src="svg_data"><img class="form__icon" src="svg_data"form__span">or use your email account</span>
                    <input class="form__input" type="text" placeholder="Email" name="eemail">
                    <input class="form__input" type="password" placeholder="Password"><a class="form__link">Forgot your password?</a>
                    <button class="button">SIGN IN</button>
                </form>

【问题讨论】:

    标签: javascript python html css django


    【解决方案1】:

    出现重复的sign/ 是因为您定义了两个映射sign_up_in 视图的URL。

    第一个在项目级别urls.py

    urlpatterns = [
        ...
        path('sign/', include("main.urls")),
    ]
    

    此模式还将“包含”来自您应用的网址urls.py

    urlpatterns = [
       ...
       path("sign/", views.sign_up_in, name = "sign_up_in") 
    ]
    

    因此,每当您在模板中调用 sign_up_in URL 时,该 URL 都会根据您定义 URL 模式的方式显示完整路径。你的情况是

    sign/ <-- from your project urls.py
         sign/ <--- from your app urls.py
    
    # output:
    sign/sign/
    
    

    为了使其正常工作,您需要删除path('sign/', include("main.urls"))

    from django.contrib import admin
    from django.urls import path, include
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('/', include("main.urls")),
    ]
    

    因此,每当您必须在您的 main 应用程序 urls.py 中定义一个新 URL 时,不要在您的项目级 URL 中重复它以避免不必要的结果。

    注意:您的main.urls 将始终以领先的/ 开头,因此明智的做法是 每当您定义新的时,请在您的 main 应用程序 urls.py 中省略任何前导 / 网址。

    【讨论】:

    • 这个解释太好了。谢谢,现在可以正常使用了。
    【解决方案2】:

    在您的应用中更改 urls.py

    path("sign/", views.sign_up_in, name = "sign_up_in")
    

    path("", views.sign_up_in, name = "sign_up_in")
    

    您已经在主 urls.py 中定义了“sign/”,因此该应用程序中的每个 url 都以 sign/* 开头

    【讨论】:

    • 我有 2 个页面,第一个是主页,第二个是注册页面。当用户点击注册按钮时,它应该转到 sign/ url。
    • 我试过你上面的解决方案,但它没有显示注册页面。
    【解决方案3】:
        urlpatterns = [
            path('admin/', admin.site.urls),
            path('', include("main.urls")),
            path('sign/', include("main.urls")), #remove this 
        ]
    

    你已经包含了一次main.urls

    【讨论】:

    • 空白的是我的主页,sign/是注册页面。当用户点击注册按钮时,它应该继续注册/ url。
    • @KshitijKarkera 这实际上是正确的,path('', include("main.urls")) 就足够了,因为 main.urls 为sign_up_in 视图提供了sign/。查看我的答案以获取更多详细信息。 `
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 2019-10-14
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 2020-03-22
    相关资源
    最近更新 更多