2

いくつかのカスタム テンプレート タグをアプリにもう少し実装して、より適切に構造化しようとしています。厄介な部分は、チュートリアルタイプの投稿に従ってコードを取得したことですが、それでも機能しません。

thiscurrent_timeに従っていくつかのタグを実装しようとしましたが、理解できないエラーが発生しています。

まず、最新の投稿のフィルター、または私の場合は最新の画面が表示されます Exception Value: No module named gallery

私のプロジェクトは「S3gallery」と呼ばれ、私のアプリは「ギャラリー」と呼ばれ、私のモデルは「スクリーンショット」と呼ばれます。タグのモデル引数は、ドキュメントで app_name.Model_name を取ると言っているので、私はこれにこだわっています。

カスタム タグ コードは次のようになります。

from django.template import Library, Node
from django.db.models import get_model

register = Library()

class LatestContentNode(Node):
    def __init__(self, model, num, varname):
        self.num, self.varname = num, varname
        self.model = get_model(*model.split('.'))

    def render(self, context):
        context[self.varname] = self.model._default_manager.all()[:self.num]
        return ''

def get_latest(parser, token):
    bits = token.contents.split()

    if len(bits) != 5:
        raise TemplateSyntaxError, "get_latest_screens tag takes exactly three arguments"
    if bits[3] != 'as':
        raise TemplateSyntaxError, "second argument to the get_latest_screens tag must be 'as'"

    return LatestContentNode(bits[1], bits[2], bits[4])

get_latest = register.tag(get_latest)

私はそれを使用してテンプレートにロードしようとしましたが、{% load get_latest gallery.screenshots 5 as recent_screens %}私が見た例ではタグに「ロード」を使用していませんが、そうするとDjangoはタグを認識しません。私はそれで迷っていますが、正しい道を進んでいると思いますか. これに関するヘルプは大歓迎です:)

4

2 に答える 2

5

{% load %}テンプレート タグは、カスタム テンプレート タグをレンダリングするのではなく、ロードするために使用されます。get_latestタグがモジュールで定義されている場合my_tags.pyは、次を使用してロードする必要があります

{% load my_tags %}

詳細については、ドキュメントのコード レイアウトのセクションを参照してください。

テンプレートにタグをロードしたら、それを使用できます。

{% get_latest gallery.screenshots 5 as recent_screens %}
于 2012-03-15T14:18:22.557 に答える
2

聞いてください、これは新しい機能なので、これを知るのにしばらく時間がかかりました。どのブログにもありませんでしたが、- について知っていますsimple_tagか?

あなたがそれを知っているなら、私は謝罪しますが、私自身のケースの99%では、これでトリックを実行できます(パーサーなし)。

これを使用して、今朝実際にデプロイした実際のコードを次に示します。

from django import template

from ost2.api.hostname import app_reverse, app_reverse_lazy

register = template.Library()

@register.simple_tag(name="app_url")
def app_url(namespaced_url, prefix=None, *args, **kwargs):
    return app_reverse(namespaced_url, args=args, kwargs=kwargs, prefix=prefix)

... これはあなたが思うように機能します: {% app_url yodogg="I heard you like tags" %}... 引数は関数呼び出しと同じように機能します。

于 2012-03-15T14:20:25.763 に答える