簡體   English   中英

為什么 Django 不會將應用名稱生成到 href 路徑中?

[英]Why Django does not generate app name into href paths?

我希望有人可以幫助我,拜托:我對 Django 很陌生,目前正在嘗試為測試頁面實現簡單的登錄/注銷。 但是,由於某些原因,Django 並沒有在 href 中生成應用程序的名稱(所以應該是 xxxx/main/register,只有 xxx/register)。 但是當我手動將應用程序名稱放入 Pycharm 的 href 中時,它會生成兩次(因此它變成了 xxx/main/main/register)。

所以為此:

<a href="/logout/">Logout</a>

我得到了這個 url: http://127.0.0.1:8000/logout/

如果我寫這個:

<a href="main/logout/">Logout</a>

我得到了這個 url: http://127.0.0.1:8000/main/main/logout/

但我需要得到這個: http://127.0.0.1:8000/main/logout/

它以前有效,但從一分鍾到另一分鍾,它突然停止指向正確的路徑。 django 對我網站中的每個鏈接都做同樣的事情。

主/urls.py:

from django.urls import path
from . import views

app_name = 'main'  # here for namespacing of urls.

urlpatterns = [
    path("", views.homepage, name="homepage"),
    path("register/", views.register, name="register" ),
    path("logout/", views.logout_request, name="logout"),
]

主/views.py:

from django.shortcuts import render, redirect
from django.http import HttpResponse
from .models import Tutorial
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
from django.contrib.auth import logout, authenticate, login
from django.contrib import messages

def homepage(request):
    return render(request = request,
                  template_name='main/home.html',
                  context = {"tutorials":Tutorial.objects.all})

def register(request):
    if request.method == "POST":
        form = UserCreationForm(request.POST)
        if form.is_valid():
            user = form.save()
            username = form.cleaned_data.get('username')
            messages.success(request, f"New account created: {username}")
            login(request, user)
            return redirect("main:homepage")
        else:
            for msg in form.error_messages:
                messages.error(request, f"{msg}: {form.error_messages[msg]}")
    else:
        form = UserCreationForm
    return render(request = request,
              template_name='main/register.html',
              context={"form":form})

def logout_request(request):
    logout(request)
    messages.info(request, "Logged out successfully!")
    return redirect("main:homepage")

我的網站/urls.py:

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

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

您應該在模板中使用 url 名稱。 它應該可以解決問題。 像這樣: <a href="{% url 'logout' %}">Logout</a>

或者使用命名空間: <a href="{% url 'main:logout' %}">Logout</a>

<a href="{% url 'logout' %}">

在 href 標記中使用名稱將起作用。

您觀察到的行為與 Django無關,它是基本的 html 功能:在第一種情況下,您使用絕對路徑(=> 以斜杠開頭)作為您的 href,在第二種情況下,您使用相對路徑(不以斜杠開頭),因此它相對於當前的 url 路徑進行解析,無論它是什么。 對於普通的 static HTML,您也會遇到同樣的問題。

This being said, in Django, you should never hardcode urls, but use the {% url <name> %} template tag (or the django.utils.reverse() function in Python code) instead, so you can change your urls in urls.py 文件沒有破壞任何東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM