既存のDjangoテンプレートタグを上書きすることは可能ですか、それともテンプレートファイルをカスタマイズして新しいテンプレートタグを作成する必要がありますか?
5 に答える
私は同じ答えを探していたので、ここで私の解決策を共有したいと思いました。カスタム テンプレート タグを使用せずに、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
「既存の Django テンプレート タグ」とは、別のアプリのタグを意味すると思います。
templatetags/tagfile.py
同名のタグを登録する を作成します。元のタグを取得するためにtagfile
テンプレートがロードする名前と同じであることを確認してください。{% load tagfile %}
また、アプリが の元のアプリの後にリストされていることを確認してくださいINSTALLED_APPS
。
はい。
django は基本的に Python ライブラリなので (Python のすべてのものと同様)、好きなものを上書きできます。
何をしたいのか正確にはわかりませんが、独自のテンプレートタグを作成するのは非常に簡単です。ドキュメントは非常に明確です: https://docs.djangoproject.com/en/dev/howto/custom-template -tags/#writing-custom-template-tags
これはクレイジーな基本ですが、これは私がカスタム テンプレート タグの作成を開始するために使用する種類のテンプレートです。
__init__.py
myapp/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
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',
],
},
},
]
templatetag
for をオーバーライドするアプリを に含める必要があります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.admin
INSTALLED_APPS
するのを忘れないで:
./manage.py collectstatic
- 設定
DEBUG = False
生産中。
result_list(cl)
関数のオーバーライドについては既にテストしており、動作しています。
このソリューションは、カスタム html テンプレート ファイルがなくても機能します。
それが役立つことを願っています。