答えの一番下にある紹介の話(答えにもっとまっすぐに)。テキストと呼ばれるテキスト処理用のアプリと画像と呼ばれる画像処理用のアプリが1つと、ブログと呼ばれるブログ用の3番目のアプリがあると仮定します。
大局
Pythonプログラマー向けのテンプレート言語に関するマニュアルを学ぶ必要があります。アイデアは、それぞれが独自のアプリにあり、すべてを接続する3番目のアプリがあるということです。次に、アプリはモデルとビューを好きなように提供し(アプリが何をすべきかに焦点を合わせ続けることを忘れないでください)、一連のテンプレートタグも提供する必要があります。
包含タグの作成方法
インクルージョンタグを作成すると、とても簡単です。通常のビューを作成することを思い出させます。
アプリフォルダにディレクトリtemplatetagsを作成します。また__init__.py
、このtemplatetagsにファイルを作成します(ディレクトリがpythonパッケージになります)。
次に、Pythonファイルを作成します。名前は重要です。これは{% load xyz %}
、アプリを使用するテンプレートで使用します。たとえば、ファイルを呼び出す場合は、それを使用するすべてのテンプレートをpicturestags.py
呼び出します。
{% load picturestags %}
最初にファイルに、あまり考える必要のないいくつかの政治を追加します。他の何よりも先にこれを含めてください。
from django.template import Library
register = Library()
次に、タグと同じ名前の関数を定義して、タグを追加します。例ではこれをdisplay_pictureと呼び、1つの引数urlを取ります。関数は、テンプレートで使用する辞書を作成する必要があります。私の例では、URLが指している画像を表示するだけです。
@register.inclusion_tag('pictures/display_picture.html')
def display_picture(url):
return {'picture': url}
アプリでパステンプレート/画像を作成し、その中に次のものを含むファイルdisplay_picture.htmlを作成します。
<img src="{{ picture }}" />
ご存知かもしれませんが、@ registerはこれをタグにします。辞書内にあるdisplay_pictureが返すのは、display_picture.htmlで使用できるものです。通常のビュー機能と非常によく似ています。
最終的には、次のファイルになります。
pictures/
__init__.py
models.py
views.py
tests.py
templates/
pictures/
display_picture.html
templatetags/
picturetags.py
Pictureアプリに追加する必要があるのはこれだけです。ブログアプリでこれを使用するには、INSTALLED_APPSに画像を追加する必要があります。次に、テンプレートで、独自の新しくホームベイクされたタグを使用する必要がある場合、最初にそれをロードします。次に、次のよう{% load picturestags %}
にタグを追加します。{% display_picture https://www.google.com/intl/sv_ALL/images/logos/images_logo_lg.gif %}
{% load picturestags %}
<html>
<body>
{% display_picture https://www.google.com/intl/sv_ALL/images/logos/images_logo_lg.gif %}
</body>
</html>
結果
これはほんの小さな例ですが、これを拡張するのは非常に簡単であることがわかります。あなたのブログは、モデルをインポートして外部キーを押すことで、TextandPicturesアプリを接続できます。特定のブログ投稿のテキストと画像を接続しています。blog_post.html-templateは次のようになります(簡略化):
{% load picturestags %}
{% load texttags %}
<html>
<body>
<h1>{{ subject }}</h1>
<div class="article">{% article_to_html articleid %}</div>
<div class="article_picture">{% display_picture %}</div>
</body>
</html>
ブログだけが依存関係を持っており、それが持つべき依存関係であることに注意してください(テキストと写真のないブログはありません...しかし、写真はテキストなしで生きることができます)。外観と配置は、CSSおよびDIV/SPANタグによって制御する必要があります。このようにして、画像アプリを取得して、テキストアプリについて知らない人に渡して使用し、コードに触れることなく、さまざまな方法で画像を表示できます。
昨日これを学んだばかりなので、インクルージョンタグだけを知っています。生活をシンプルにするためにDjangoが提供する便利さだと思います。ドキュメントページには、さらに多くの情報があります(「実際の」タグを「ショートカット」なしで難しい方法にする方法を含む)。したがって、この方法が制限されていることに気付いた場合は、ドキュメントを読んでください...多くの例があります。また、フィルター、simple_tags、スレッドの考慮事項、およびその他の高度な機能の作成方法についても説明します。
序章
私はあなたと同じようにこの問題を抱えていました、そして私はまた私が読んだ答えとは異なる何かを望んでいました(私は答えが悪いとは言いません、彼らは私に多くを学びそして私に洞察を与えてくれました、しかし私は今書いているこれを望んでいました) 。私はあなたの質問のおかげで、そして間違いなくStack Overflowのおかげで、あまり明白ではない何かを理解することができたので、これはおそらく放棄された半年前の質問への私の貢献です(グーグルを助けるかもしれません)!
また、 Google Tech TalkReusableAppsから多くのインスピレーションを得ました。最後に(43分)、彼はdjango-taggingのようないくつかの良い例に言及します。これは、再利用可能なアプリを作成する方法のモデルであると彼は言います。それは私にこれらすべてのアイデアを与えました、なぜならそれはdjangoタグ付けが私たちが持っていた/持っているこのまさに問題を解決する方法だからです。
これをすべて書いた後(1時間かかりました)、グーグルだけでなく、他の人がしていることをフォローしたり、他の人が私が必要なことを書いていないと不平を言ったりするのではなく、貢献できるかもしれないと初めて感じます。他の人がこれをグーグルできるように、私は初めて自分の意見を書く責任を負っています(この段落を書かなければなりませんでした:-)それは細かく砕かれたり無視され忘れられたりしても本当に素晴らしい気分です)。