17

既存のDjangoテンプレートタグを上書きすることは可能ですか、それともテンプレートファイルをカスタマイズして新しいテンプレートタグを作成する必要がありますか?

4

5 に答える 5

21

私は同じ答えを探していたので、ここで私の解決策を共有したいと思いました。カスタム テンプレート タグを使用せずに、django のデフォルトの url テンプレート タグをオーバーライドして、すべてのテンプレート ファイルにロードしたいと考えていました。

目標は、%20 (スペース) を + (プラス) に置き換えることでした。これが私が思いついたものです...

__init__.py

from django.template.defaulttags import URLNode

old_render = URLNode.render
def new_render(cls, context):
  """ Override existing url method to use pluses instead of spaces
  """
  return old_render(cls, context).replace("%20", "+")
URLNode.render = new_render

このページは役に立ちましたhttps://github.com/django/django/blob/master/django/template/defaulttags.py

于 2013-11-15T20:15:32.167 に答える
10

「既存の Django テンプレート タグ」とは、別のアプリのタグを意味すると思います。

templatetags/tagfile.py同名のタグを登録する を作成します。元のタグを取得するためにtagfileテンプレートがロードする名前と同じであることを確認してください。{% load tagfile %}

また、アプリが の元のアプリの後にリストされていることを確認してくださいINSTALLED_APPS

于 2013-10-08T14:54:19.777 に答える
2

はい。

django は基本的に Python ライブラリなので (Python のすべてのものと同様)、好きなものを上書きできます。

何をしたいのか正確にはわかりませんが、独自のテンプレートタグを作成するのは非常に簡単です。ドキュメントは非常に明確です: https://docs.djangoproject.com/en/dev/howto/custom-template -tags/#writing-custom-template-tags

これはクレイジーな基本ですが、これは私がカスタム テンプレート タグの作成を開始するために使用する種類のテンプレートです。

__init__.pymyapp/templatetags/my_custom_tags.py (このディレクトリにある必要があります)

from django import template
register = template.Library()

class CustomTag(template.Node):
    def render(self, context):
        context['my_custom_tag_context'] = "this is my custom tag, yeah"
        return ''

@register.tag(name='get_custom_tag')
def get_custom_tag(parser, token):
    return CustomTag()

テンプレートでの使用法は次のようになります。

{% load my_custom_tags %}
{% get_custom_tag %}
{{my_custom_tag_context}}

あなたはおそらく を解析したいtokenと思うでしょうし、おそらくクラス内である種の を望んでいるでしょう__init__が、それがいかに基本的なものであるかを示しています。


既存の「デフォルト」のテンプレートタグをブラウズし、それらを複製して心ゆくまで変更することができます。

そこには本当に素晴らしいものがいくつかあります: https://github.com/django/django/blob/master/django/template/defaulttags.py

于 2012-11-05T09:43:31.457 に答える
2

django の完全なオーバーライドを求めていると確信していますtemplatetag

短い答えは -Yesです。既存の をオーバーライドできますtemplatetag

これを達成する方法は次のとおりです。

  • テンプレート ディレクトリを以下に含める必要がありますsettings
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, 'your_app/templates')],
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                    'django.template.context_processors.static',
                ],
            },
        },
    ]
  • templatetagfor をオーバーライドするアプリを に含める必要がありますINSTALLED_APPS
INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'your_app_name',
        ...
    ]

重要なのは、django のアプリの後にアプリを配置することです。

これは、django の動作によるものです。私たちはそれを使用する権利を取得します。

  • 次に、アプリ内に という名前のフォルダーを作成しますtemplatetags。django が python パッケージであることを理解できるように、__init__.py内にファイルを保持することが重要です!:templatetags

your_app_name/templatetags/__init__.py.

  • オーバーライドする を作成templatetagします。その例では、admin_list.pyタグを使用します。

その場合、次のように配置する必要があります。

your_app_name/templatetags/admin_list.py

  • admin_list.py (非常に重要です!)の内容全体をコピーして、django.contrib.admin.templatetags.admin_list.py必要に応じて変更します。

コードの一部だけでなく、django の管理者のコンテンツ全体を用意することが重要admin_list.pyです。そうしないと機能しません。


仕組み: Django はアプリケーション内でtemplatetagsフォルダを探し、その中のテンプレート タグを使用します。それはあなたのテンプレートタグをそれらの後に配置し、admin's要するに..django.adminINSTALLED_APPS

するのを忘れないで:

  • ./manage.py collectstatic
  • 設定DEBUG = False

生産中。

result_list(cl)関数のオーバーライドについては既にテストしており、動作しています。


このソリューションは、カスタム html テンプレート ファイルがなくても機能します。

それが役立つことを願っています。

于 2019-04-09T16:25:29.240 に答える