未定义错误:在Django中使用Jinja2时' url_for '未定义。

3

我正在尝试在Django中使用Jinja2模板语言。在尝试渲染模板时,我遇到了错误“jinja2.exceptions.UndefinedError: 'url_for'未定义”。当与Flask应用程序中的模板一起使用时,'url_for()'运行得非常好。

模板如下:

{% extends "login_auth/base.html" %}
{% block title %} ProjectName {% endblock %}
{% block style %} 
    <link rel="stylesheet" href="{{url_for('static/login_auth', filename='index_stl.css')}}">    
    <script src="{{ url_for('static/login_auth', filename='index.js') }}"></script>
{% endblock %}

追踪信息如下:
File "/home/ParserMouth/folder1/folder2/ProjectName/myvenv/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
  34.             response = get_response(request)

File "/home/ParserMouth/folder1/folder2/ProjectName/myvenv/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
  115.                 response = self.process_exception_by_middleware(e, request)

File "/home/ParserMouth/folder1/folder2/ProjectName/myvenv/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
  113.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/home/ParserMouth/folder1/folder2/ProjectName/ProjectName/login_auth/views.py" in index
  10.     return render(request,"login_auth/index.html")  # index.html will be welcome screen

File "/home/ParserMouth/folder1/folder2/ProjectName/myvenv/lib/python3.6/site-packages/django/shortcuts.py" in render
  36.     content = loader.render_to_string(template_name, context, request, using=using)

File "/home/ParserMouth/folder1/folder2/ProjectName/myvenv/lib/python3.6/site-packages/django/template/loader.py" in render_to_string
  62.     return template.render(context, request)

File "/home/ParserMouth/folder1/folder2/ProjectName/myvenv/lib/python3.6/site-packages/django/template/backends/jinja2.py" in render
  71.         return self.template.render(context)

File "/home/ParserMouth/folder1/folder2/ProjectName/myvenv/lib/python3.6/site-packages/jinja2/asyncsupport.py" in render
  76.             return original_render(self, *args, **kwargs)

File "/home/ParserMouth/folder1/folder2/ProjectName/myvenv/lib/python3.6/site-packages/jinja2/environment.py" in render
  1008.         return self.environment.handle_exception(exc_info, True)

File "/home/ParserMouth/folder1/folder2/ProjectName/myvenv/lib/python3.6/site-packages/jinja2/environment.py" in handle_exception
  780.         reraise(exc_type, exc_value, tb)

File "/home/ParserMouth/folder1/folder2/ProjectName/myvenv/lib/python3.6/site-packages/jinja2/_compat.py" in reraise
  37.             raise value.with_traceback(tb)

File "/home/ParserMouth/folder1/folder2/ProjectName/ProjectName/login_auth/jinja2/login_auth/index.html" in top-level template folder2
  1. {% extends "login_auth/base.html" %}

File "/home/ParserMouth/folder1/folder2/ProjectName/ProjectName/login_auth/jinja2/login_auth/base.html" in top-level template folder2
  12.         {% block style %} {% endblock %}    

File "/home/ParserMouth/folder1/folder2/ProjectName/ProjectName/login_auth/jinja2/login_auth/index.html" in block "style"
  4.     <link rel="stylesheet" href="{{ url_for('static/login_auth', filename='index_stl.css') }}">

Exception Type: UndefinedError at /
Exception Value: 'url_for' is undefined

我想知道如何解决这个问题。提前感谢。


@VoteCoffee 先生,这个问题是关于Django的特定问题。 - EternalObserver
3个回答

3
我为我的问题找到了答案。问题发生是因为' url_for '函数由Flask提供,而不是Jinja2。所以,您需要进行一些配置才能在模板中加载静态文件。 1. 在项目的默认应用程序中添加jinja2.py,并添加以下代码:
from django.contrib.staticfiles.storage import staticfiles_storage
from django.urls import reversefrom jinja2 import Environmentdef environment(**options):
    env = Environment(**options)
    env.globals.update({
        ‘static’: staticfiles_storage.url,
        ‘url’: reverse,
    })
 return env

在此之后,您需要替换以下内容:
<link rel="stylesheet" href="{{url_for('static/login_auth', filename='index_stl.css')}}">    
<script src="{{ url_for('static/login_auth', filename='index.js') }}"></script>

使用这个:

<link rel=”stylesheet” href="{{ static('login_auth/index.css') }}">
<script src="{{ static('login_auth/index.js') }}"></script>

参考资料:在 Django 中使用 Jinja2


我在使用Flask渲染Jinja2时遇到了同样的错误。它提示url_for未定义。你对Flask有什么了解吗? - AzamAbbasi
@Harley,请检查你是否正在导入静态文件,并且在你的虚拟环境中正确配置了jinja2。据我所知,你不应该遇到这个问题,因为你正在使用flask而不是django。 - EternalObserver
1
@AzamAbbasi 希望你现在已经找到了答案,但如果有人正在寻找 Flask 版本,则在渲染模板时可以传递 Flask 的 url_for。 例如:env.get_template('xyz.html').render(url_for=url_for) - Karishma Sukhwani

0

我认为你已经导入了

from jinja2 import Environment
from jinja2.loaders import FileSystemLoader

如果前端在 jinja2 中寻找不可用的 {{ url_for() }},尝试使用后端逻辑进行解决:

csslink = url_for('static/login_auth', filename='index_stl.css')
jslink = url_for('static/login_auth', filename='index.js')

return tmpl.render(csslink = csslink, jslink = jslink )

并在前端

<link rel="stylesheet" href="{{ csslink }}">    
<script src="{{ jslink }}"></script>

-2

先生,正如我在问题中提到的,我在我的项目中使用的是Jinja2模板引擎,而不是Django的默认模板。我在模板中使用"url_for"来加载静态文件,而不是尝试链接到Django应用程序中的视图获取URL。 - EternalObserver
我的错!你可以尝试类似这样的代码: {{url('app-views-client',args=[client.id])}} 或者 {{url('app-views-client',kwargs={'id':client.id})}} - BleuBizarre
好的,没问题。我会尽力并回复您。 - EternalObserver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接