UndefinedError: 'url_for' не определено;при использовании Jinja2 в Django - PullRequest
0 голосов
/ 05 ноября 2019

Я пытаюсь использовать язык шаблонов Jinja2 с Django. При попытке отобразить шаблон я получил ошибку «jinja2.exceptions.UndefinedError:« url_for »не определен». Функция url_for () работает абсолютно нормально при использовании с шаблонами в приложениях Flask.

Шаблон выглядит следующим образом:

{% 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

Я хочу знать, как решить эту проблему. Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2019

Я разобрался с ответом на мой вопрос. Проблема возникла из-за того, что функция 'url_for' предоставляется Flask, а не Jinja2. Так что вам нужно немного настроить для загрузки статических файлов в ваши шаблоны. 1. Добавьте jinja2.py в приложение Project по умолчанию и добавьте в него следующий код:

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>

Ссылка: Использование Jinja2 с Django

0 голосов
/ 05 ноября 2019

Я думаю, что вы ищете фильтр URL

, если у вас есть это в ваших URL:

path('client/<int:id>/', app_views.client, name='app-views-client')

, вы можете назвать его так:

{% url 'app-views-client' client.id %}

информация: https://docs.djangoproject.com/fr/2.2/ref/templates/builtins/#url

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...