Django 1.11:模板中的 URL 函数未按预期工作

Posted

技术标签:

【中文标题】Django 1.11:模板中的 URL 函数未按预期工作【英文标题】:Django 1.11: URL function in template not working as expected 【发布时间】:2019-11-13 23:02:39 【问题描述】:

我创建了 2 个测试应用程序 test1 和 test2,并在视图中添加了相同的功能,并在 url 文件中添加了相同的条目。问题是您访问哪个应用程序并不重要,相同的链接 appname/link 显示为 href。

不管我访问http://127.0.0.1:8000/test1还是http://127.0.0.1/test2,链接总是“Test Link”

使用语法 url 'appname:link' 确实有效,并且向 html 模板发送一个额外的参数以使用应用程序名称确实有效,但是如何仅使用 url 'link' 来解决它

项目网址:

from django.conf.urls import include, url
from django.views import generic
from . import views

urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'^test1/', include('test1.urls')),
    url(r'^test2/', include('test2.urls')),
]

test1 网址:

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'testapp/', views.testapp, name='testapp'),

]

test2 网址:

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'testapp/', views.testapp, name='testapp'),


]

test1 浏览量:

from django.shortcuts import render

def index(request):
    return render(request, 'testme.html')

def testapp(request):
    return render(request, 'testme.html') 

test2 视图:

from django.shortcuts import render

def index(request):
    return render(request, 'testme.html')

def testapp(request):
    return render(request, 'testme.html') 

testme.html:

<a href = % url 'testapp' %>Test Link</a> 

是否有一个设置可以设置为仅使用 url 'linkname' 而不是使用 url 'appname:linkname'?

【问题讨论】:

【参考方案1】:

您有 2 个名为 testapp 的网址。

将 test2 网址更改为(或提供应用名称)

urlpatterns = [
    url(r'^$', views.index, name='index2'),
    url(r'testapp/', views.testapp, name='testapp2'),
]

另外,在模板中添加引号

<a href ="% url 'testapp' %">Test Link</a> 

【讨论】:

按照建议更改了代码,但仍然是同样的问题。 那我误解了你想要达到的目标。我重读了您的帖子,无法确定您的目标【参考方案2】:

test1test2 使用相同的模板

首先创建2个模板test1test2

test1 views.py

def index(request):
    return render(request,'test1.html')

test1 urls.py

url(r'^$',views.index, name='test1'),

test1 模板test1.html

<a href = % url 'test1' %>Test 1 Link</a>

test2views.py

def index(request):
    return render(request, 'test2.html')

test2urls.py

url(r'^$',views.index, name='test2'),

test2 模板test2.html

<a href = % url 'test2' %>Test 2 Link</a>

项目urls.py

path('test1/',include('test1.urls')),
path('test2/', include('test1.urls'))

【讨论】:

【参考方案3】:

通过使用中间件让它工作,目标是使用多个应用程序和 1 个模板。

类获取名称(对象): def init(self, get_response): self.get_response = get_response

def __call__(self, request):
    return self.get_response(request)

def process_view(self, request, view_func, view_args, view_kwargs):
    request.view_full_name = ".".join((view_func.__module__, view_func.__name__))
    view_app_name_temp = request.view_full_name.split('.')
    request.view_app_name = view_app_name_temp[0]

在模板上,将 href 链接更改为以下内容: href='/request.view_app_name/register'

【讨论】:

以上是关于Django 1.11:模板中的 URL 函数未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

Django 1.11:在 url 中的查询参数中浮动

Django 1.11 如何从保存在 CMS 站点模型中的 HTML 中显示模板变量

Django 1.11 CreateView 传递 URL 参数

Django - - 基础 - - Django的路由系统

Django 1.11 使用来自应用程序的模板作为管理模板

Django 模板在更新后没有改变(可能缓存)