2016-01-28 14 views
5

Ich habe ein benutzerdefiniertes Tag erstellt, das ich verwenden möchte, aber Django scheint es nicht zu finden. Mein templatetags Verzeichnis ist wie folgt aufgebaut:Django - Haben Sie vergessen, dieses Tag zu registrieren oder zu laden?

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()) 

ich diesen Tag zu verwenden versuchen Code zu machen in 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 %} 

Wenn ich navigieren zu gameprofile.html, erhalte ich eine Fehlermeldung:

Invalid block tag on line 23: 'code', expected 'endblock'. Did you forget to register or load this tag?

+0

'ist {% do_code%} {% endcode%}' arbeiten? (ist es den Namen zu ignorieren) – Sayse

+0

Ich habe es versucht, und 'do_code' funktioniert auch nicht. – 123

+0

Hmm, die einzige Sache, die wirklich fehl am Platz dann zu mir ist, ist die Tatsache, dass Sie einen Block innerhalb eines Blocks haben ... nicht sicher, ob das die Dinge beeinflussen würde oder nicht (der Titel).(Ich könnte mich irren, ich glaube nicht, dass ich irgendwelche verschachtelten Blöcke verwende) – Sayse

Antwort

0

Die Anwendung, die die benutzerdefinierten Tags enthält in INSTALLED_APPS sein muss. Sind Sie sicher, dass Ihr Verzeichnis in INSTALLED_APPS ist?

Vom documentation:

The app that contains the custom tags must be in INSTALLED_APPS in order for the {% load %} tag to work. This is a security feature: It allows you to host Python code for many template libraries on a single host machine without enabling access to all of them for every Django installation.

+0

Die App 'games' ist in installierten Apps enthalten. – 123

+0

Die App, die die benutzerdefinierten Tags enthält, die hier Vorlagetags ist –

+0

Ich bekomme 'ImportError: Kein Modul namens tasteletags' – 123

9

haben Sie versucht, diese

{% load games_tags %} 

an der Spitze statt pygmentize?

+5

warum? Pygmentize wird durch game_tags ersetzt? Es gibt keine Datei mit game_tags name – f3n1Xx

+4

Es gibt keine "game_tags" im ursprünglichen Beitrag. Diese Antwort ist nicht hilfreich. – HBat

5

Der Fehler ist in dieser Zeile: (% load pygmentize %}, ein ungültiges Tag. Ändern Sie es zu {% load pygmentize %}

1

Ich hatte das gleiche Problem, hier ist, wie ich es gelöst habe. Im Anschluss an den ersten Abschnitt von this very excellent Django tutorial, habe ich die folgenden:

  1. Erstellen Sie eine neue Django App durch die Ausführung: python manage.py startapp new_app
  2. bearbeiten die settings.py Datei, Hinzufügen der folgenden in die Liste der INSTALLED_APPS: 'new_app',
  3. hinzufügen neues Modul zum new_app Paket mit dem Namen new_app_tags.
  4. In einer Vorlage Django HTML, fügen Sie den Anfang der Datei des folgenden, aber nach {% extends 'base_template_name.html' %}: {% load new_app_tags %}
  5. In new_app_tags Moduldatei, einen eigenen Template-Tag (siehe unten) erstellen.
  6. In der gleichen Django HTML-Vorlage, von Schritt 4 oben, verwenden Sie Ihre Shiney neue benutzerdefinierte Tag wie folgt: {% multiply_by_two | "5.0" %}
  7. Celebrate!

Beispiel aus Schritt 5:

from django import template 

register = template.Library() 

@register.simple_tag 
def multiply_by_two(value): 
    return float(value) * 2.0