3

このガイドを参照として使用して、 TWIGの set 構文に適用される Django テンプレート用の set タグ パーサーを作成しました。

{% set someVar %} variableAssignment {% endset %}

私はテンプレート システムに Django のみを使用しており、この時点までは正しいインポートを使用してテンプレートを正しく表示することができました。ここに私が現在持っているコードがあります:

from django.template import Context, Template, Library, Node, TemplateSyntaxError, Variable, VariableDoesNotExist, resolve_variable
from django.template.loader import *
from django.conf import settings
settings.configure(TEMPLATE_DIRS="/my/templates")
register = Library()
class SetValueNode(Node):
    def __init__(self, variable, nodelist):
        self.variable = variable
        self.nodelist = nodelist
    def render(self, context):
        context[self.variable] = self.nodelist.render(context)
        return ""

@register.tag(name="set")
def set_tag(parser, token):
    print "set_tag called: parser",parser," token",token
    nodelist = parser.parse(("endset",))
    parser.delete_first_token()
    return SetValueNode(arg, nodelist)

def sendServiceEmail(username, first, last, service, service_tuple):
    TEMPLATES_DIR = "/my/templates/"
    emailStr = "myemail.html.twig"
    print "Opening file :"+TEMPLATES_DIR+emailStr
    t = Template(fp.read())
    fp.close()
    c = Context({
            /*Add context from parameters*/
        })
    msg = t.render(c)
    print msg

しかし、私が得るエラーは次のとおりです。

django.template.base.TemplateSyntaxError: 'set_tag' is not a valid tag library: Template library set_tag not found, tried django.templatetags.set_tag

いくつかの調査を行ってしばらく考えた後、django が検索しているライブラリは「標準」ライブラリのようです。誰か (django 設定、テンプレート、または .render) に「ライブラリ」を使用してもらい、ライブラリをチェックしてテンプレートタグが登録されているかどうかを確認する必要があると思います。Djangoアプリを作成せずに、この情報をDjangoに渡す方法はありますか?

4

2 に答える 2

2

次の情報は Django 1.4 に適用され ます。3 つのオプションがあります。

アプリケーションソリューション

構造が定義されたアプリケーションを作成する必要がありますが、完全な django アプリである必要はありません。あなたがそれを呼ぶとしましょうmyapp

必須のファイル構造は次のとおりです

myapp/
  __init__.py
  templatetags/
    __init__.py
    your_library.py

メインスクリプトで次のことを行います

from django.conf import settings
from django.template.loader import get_template

# You need to configure Django a bit
settings.configure(
    # Access to template tags
    INSTALLED_APPS=('myapp', ),
    # Access to templates
    TEMPLATE_DIRS=(TEMPLATES_DIR, ),
)

template = get_template("myemail.html.twig")
# Prepare context ....
return t.render(context)

モジュールソリューション

このような大きな構造を使用したくない場合は、テンプレート タグを使用してモジュールのみを作成し、それをdjango.template.base.add_to_builtinsメソッドに渡すことができるはずです。https://github.com/django/django/blob/master/django/templateを参照してください。 /base.py#L1349 .

まったく違うもの

または、代わりに jinja2 http://jinja.pocoo.org/docs/の使用を検討することもできますが、そこでタグが機能するかどうかはわかりません。

于 2013-11-15T13:05:52.823 に答える