导航栏中的 Django 上下文变量 - 正确的 href 分配?

Django context variable in the navigation bar - correct href assignment?

导航栏中上下文变量的正确分配是什么?我的 Django 示例是:

view.py:

from django.shortcuts import render
from django.http import HttpResponse 

context_navigation =   {
           'Link1'    : 'Blog',
           'href1'    : "{% url 'blog' %}",   }

def index(request):
    return render(request, 'app_about/index.html', context=context_navigation)  
    

urls.py:

from django.urls import path
from . import views

urlpatterns = [ 
    path('blog/', views.index, name='blog'),  
    ]
    

templates/base.html 这行得通

<a class="nav-item nav-link text-light"  href="{% url 'blog' %}" > {{Link1}}</a>

这个不起作用(参见href1Link1

<a class="nav-item nav-link text-light"  href="{{href1}}" > {{Link1}}</a>

在最后一种情况下会生成错误的 url,类似于 http://127.0.0.1:8000/blog/%7B%href 作为上下文变量 href1 的正确分配是什么?谢谢你的提示!

在第二个示例中,您插入了一个变量 href1,它在呈现时被内容(字符串){% url 'blog %} 替换。 Django 尝试呈现此字符串(使其 html 安全,这就是 %7B.. 的来源,它只是 {.[=21= 的 html 代码]

选项 1:在视图中解析 url

您可以在视图中使用 python 解析 url 并将实际的 url 作为字符串传递给模板:

views.py

from django.urls import reverse

context_navigation =   {
       'Link1'    : 'Blog',
       'href1'    : reverse('blog')
}

base.html

<a class="nav-item nav-link text-light"  href="{{href1}}">{{Link1}}</a>

选项 2:在模板中解析 url

或者您使用第一个示例,其中 {% url 'blog %} 将由模板渲染引擎解释和执行:

context_navigation =   {
       'Link1'    : 'Blog'
}

base.html

<a class="nav-item nav-link text-light"  href="{% url 'blog' %}">{{Link1}}</a>

选项 3:视图传递 url(名称),模板解析它(未测试)

如果您需要动态生成上下文但想要解析模板中的实际 urls,您可以将 url 名称作为变量传递,例如:

context_navigation =   {
       'Link1': 'Blog',
       'url1': 'blog',
}

base.html

<a class="nav-item nav-link text-light"  href="{% url url1 %}">{{Link1}}</a>

但我不确定你是否可以像这样在模板标签中使用变量(只是猜测,从未这样使用过)

谢谢@sarbot 的回答!说说我的经历吧。

选项 1 看起来很精简并且符合 django 手册,所以我更喜欢它作为解决方案。不幸的是,我不得不与 runserver 不喜欢这种方法并生成致命的 Python 错误这一事实作斗争。暂时我没有解释。

选项 2 是我开始使用的选项,它有效。对于干净的编程风格,我宁愿不要坚持使用它。

选项 3 适合我,所以我不用多说谢谢 :-)