首页 > 解决方案 > 导航栏中的 Django 上下文变量 - 正确的 href 分配?

问题描述

导航栏中上下文变量的正确分配是什么?我的 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'),  
    ]
    

模板/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什么?谢谢你的一些提示!

标签: pythondjangodjango-templatesdjango-urlsdjango-context

解决方案


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

选项 1:在视图中解析 url

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

视图.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(名称)和模板解析它(未测试)

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

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

base.html

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

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


推荐阅读