[英]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.