J'ai créé un tag personnalisé que je veux utiliser, mais Django ne semble pas le trouver. Mon répertoire templatetags
est configuré comme suit:
pygmentize.py
from pygments import highlight
from pygments.lexers import get_lexer_by_name
from Django import template
from pygments.formatters.other import NullFormatter
register = template.Library()
@register.tag(name='code')
def do_code(parser,token):
code = token.split_contents()[-1]
nodelist = parser.parse(('endcode',))
parser.delete_first_token()
return CodeNode(code,nodelist)
class CodeNode(template.Node):
def __init__(self,lang,code):
self.lang = lang
self.nodelist = code
def render(self,context):
code = self.nodelist.render(context)
lexer = get_lexer_by_name('python')
return highlight(code,lexer,NullFormatter())
J'essaie d'utiliser cette balise pour rendre le code dans gameprofile.html
.
gameprofile.html
(% load pygmentize %}
{% block content %}
<title>{% block title %} | {{ game.title }}{% endblock %}</title>
<div id="gamecodecontainer">
{% code %}
{{game.code}}
{% endcode %}
</div>
{% endblock content %}
Lorsque je navigue vers gameprofile.html
, j'obtiens une erreur:
Balise de bloc non valide à la ligne 23: "code", attendu "endblock". Avez-vous oublié de vous inscrire ou de charger cette balise?
avez-vous essayé cela
{% load games_tags %}
au sommet au lieu de pygmentize?
L'erreur est dans cette ligne: (% load pygmentize %}
, une balise non valide . Changez-le en {% load pygmentize %}
J'ai eu le même problème, voici comment je l'ai résolu. Après la première section de ce très bon tutoriel Django , j’ai fait ce qui suit:
python manage.py startapp new_app
settings.py
en ajoutant les éléments suivants à la liste de INSTALLED_APPS
: 'new_app',
new_app
nommé new_app_tags
.{% extends 'base_template_name.html' %}
: {% load new_app_tags %}
new_app_tags
, créez une balise de modèle personnalisé (voir ci-dessous).{% multiply_by_two | "5.0" %}
Exemple de l'étape 5 ci-dessus:
from Django import template
register = template.Library()
@register.simple_tag
def multiply_by_two(value):
return float(value) * 2.0
Dans gameprofile.html
, remplacez la balise {% endblock content %}
par {% endblock %}
, sinon cela fonctionnera, sinon Django ne chargera pas le endblock et donnera une erreur.
Vous devez changer:
{% endblock content %}
à
{% endblock %}
L'application contenant les balises personnalisées doit être dans INSTALLED_APPS
. Alors, êtes-vous sûr que votre répertoire est en INSTALLED_APPS
?
De la documentation :
L'application contenant les balises personnalisées doit être dans
INSTALLED_APPS
pour que la balise{% load %}
fonctionne. Il s’agit d’une fonctionnalité de sécurité: elle vous permet d’héberger du code Python pour de nombreuses bibliothèques de modèles sur un seul ordinateur hôte sans permettre l’accès à toutes ces bibliothèques pour chaque installation Django.