web-dev-qa-db-fra.com

Django - Avez-vous oublié de vous enregistrer ou de charger cette balise?

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?

5
123

avez-vous essayé cela

{% load games_tags %} 

au sommet au lieu de pygmentize? 

9
losee

L'erreur est dans cette ligne: (% load pygmentize %}, une balise non valide . Changez-le en {% load pygmentize %}

6
Erick M

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:

  1. Créez une nouvelle application Django en exécutant: python manage.py startapp new_app
  2. Editez le fichier settings.py en ajoutant les éléments suivants à la liste de INSTALLED_APPS: 'new_app',
  3. Ajoutez un nouveau module au package new_app nommé new_app_tags.
  4. Dans un modèle HTML Django, ajoutez ce qui suit en haut du fichier, mais après {% extends 'base_template_name.html' %}: {% load new_app_tags %}
  5. Dans le fichier de module new_app_tags, créez une balise de modèle personnalisé (voir ci-dessous).
  6. Dans le même modèle HTML Django, à partir de l'étape 4 ci-dessus, utilisez votre nouvelle balise personnalisée shiney comme suit: {% multiply_by_two | "5.0" %}
  7. Célébrer!

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
2
MikeyE

Dans gameprofile.html, remplacez la balise {% endblock content %} par {% endblock %}, sinon cela fonctionnera, sinon Django ne chargera pas le endblock et donnera une erreur.

0
Pardhu Saradhi

Vous devez changer:

{% endblock content %}

à 

{% endblock %}
0
Rahul Nama

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.

0
Ahmed Hosny