1

少し前にいくつかの異なる方法を試しましたが、それぞれ異なる例外が発生したため、あきらめて、必要なときに手動でフィルターを作成することにしました。しかし、ネイティブの escapejs やその他の便利だが単純なフィルターがありません。

関連する質問と回答がいくつかありますが、私が見る限り、これをシームレスに実装する方法を提供するものはありません。主な問題は、django フィルター ルーチンが django 環境に結び付けられすぎていることだと思います。

Appengine SDK 環境で組み込みの django フィルタを使用できた場合のみ回答してください。私の経験では、Appengine 環境が制限されているため、通常の環境に比べて難しいです。

4

2 に答える 2

1

Django テンプレート エンジンのテンプレート タグは、値とパラメーターを受け入れる単純な関数です。これらはすべて、ソース コードで直接アクセスできます。

これは IPython からの出力です。

In [173]: from django.template.defaultfilters import  date 

In [174]: date??
Type:       function
String Form:<function date at 0xa2935f0>
File:       /usr/local/python/thor/lib/python2.7/site-packages/django/template/defaultfilters.py
Definition: date(value, arg=None)
Source:
@register.filter(expects_localtime=True, is_safe=False)
def date(value, arg=None):
    """Formats a date according to the given format."""
    if not value:
        return u''
    if arg is None:
        arg = settings.DATE_FORMAT
    try:
        return formats.date_format(value, arg)
    except AttributeError:
        try:
            return format(value, arg)
        except AttributeError:
            return ''

Django 固有のマジックのほとんどは、デコレータ ( ) と、テンプレートregister.filterに入力したときに言語が呼び出しを解決する方法にあります。モジュール{% load <template library> %}内の定義を探します。<module>.templatetagsビルトインは および にdjango.template.defaulttagsありdjango.template.defaultfiltersます。

Jinja2 に新しいテンプレート フィルターを定義する方法がある場合 (おそらくそうです)、手作りのテンプレート フィルターを実際の Django 関数に単純にラップできます。

したがって、基本的には、実際の Django 関数定義を指す Jinja2 フィルターを作成するだけです。

編集: 実際の Django 関数にアクセスできない場合は、ソース コードをコピーして貼り付け、Django 固有のものを削除または適応させてください。

escapejsフィルターは、実際には次の関数の呼び出しですdjango.utils.html

_base_js_escapes = (
    ('\\', r'\u005C'),
    ('\'', r'\u0027'),
    ('"', r'\u0022'),
    ('>', r'\u003E'),
    ('<', r'\u003C'),
    ('&', r'\u0026'),
    ('=', r'\u003D'),
    ('-', r'\u002D'),
    (';', r'\u003B'),
    (u'\u2028', r'\u2028'),
    (u'\u2029', r'\u2029')
)

# Escape every ASCII character with a value less than 32.
_js_escapes = (_base_js_escapes +
               tuple([('%c' % z, '\\u%04X' % z) for z in range(32)]))

def escapejs(value):
    """Hex encodes characters for use in JavaScript strings."""
    for bad, good in _js_escapes:
        value = mark_safe(force_unicode(value).replace(bad, good))
    return value
于 2013-01-22T23:17:00.490 に答える
1

コメントでこれをほのめかしましたが、スペースがあるので、ここでより具体的にします。Django はエンド ツー エンドの Web アプリケーション フレームワークであり、たまたま独自のテンプレート言語が含まれています。適切な用語がないため、単に「Django テンプレート言語」と呼ばれています。ドキュメント内のすべてのテンプレート タグとフィルターは、その言語に固有のものです。

Jinja2 を使用することを選択した場合は、Django の構造を除外して、そのテンプレート言語の構造を使用することを選択します。(明らかに、モデルとビューのものは別のレイヤーですが、原則として、それらも交換できます-すべて疎結合です。)その場合、テンプレート化に関するDjangoドキュメントは役に立ちません。Jinja2 で float をフォーマットする場合は、 Jinja docsformatによると、フィルターを使用する必要があるようです。

詳細情報がなければ、ImportError の原因を特定することはできませんが、Jinja2floatformatテンプレートでは機能しないため、何か関係がある可能性があります。

于 2013-01-17T21:15:11.070 に答える