1

Djangoプロジェクトが複数のサイトにインストールされています。それらのいくつかでは、たとえば、フロントページに表示されるステータスボックスを生成するアプリもあります。アプリがインストールされている場合に表示する正しい方法は何ですか。アプリが存在しない場合は、何も表示されません。

ステータスアプリにメインのインデックスページを拡張させることで、それができると思います。

{% extends "mainproject/index.html" %}

{% block statusboxplaceholder %}
<div> status here </div>
{% endblock %}

それは正しい、慣用的なアプローチですか?少しだけコンテンツを追加するためにフロントページ全体を拡張するのは少し直感に反しているようです。

編集:また、アプリが独自の「インデックス」ページを定義するという事実を管理するにはどうすればよいですか?プロジェクト全体の「インデックス」ページよりも優先して表示する必要がありますか?プロジェクトのurls.pyにそれへの参照をハードコーディングしたくないのは明らかです。そのデプロイメントでインストールされる特定のアプリを参照するデプロイメント固有のurls.pyを作成しますか?もしそうなら、それはINSTALLED_APPSの情報を繰り返し、したがってDRYに違反していませんか?

4

1 に答える 1

2

あなたのアプローチに問題はありませんが、特に後でインストールする可能性のある他のアプリケーションにこの機能を拡張したい場合は、汎用テンプレートタグが最も柔軟性が高いと思います。

基本テンプレートは、一般的な「ボックス」タグをロードします。タグのソースでは、その特定のインスタンスにインストールされているアプリに基づいて、必要なものをレンダリングできます。そのため、ボックスをレンダリングするための一連のデフォルトアプリを用意したり、エンドユーザーがボックスをレンダリングするアプリをカスタマイズしたりできます。

設定、構成、またはタグ自体で、アプリごとにブロック用にレンダリングするテンプレートを特定できます。

各アプリのテンプレートがディレクトリにあると仮定すると、app/templatesこの疑似操作でうまくいくはずです(これはテストされていません)。

from django.conf import settings
from django import template
register = template.Library()

class GenericBox(template.Node):
   def __init__(self, app):
      self.app = app
   def render(self, context):
      if self.app not in settings.INSTALLED_APPS:
         return '' # if the app is not installed
      # Here you would probably do a lookup against
      # django.settings or some other lookup to find out which
      # template to load based on the app.
      t = template.loader.get_template('some_template.html') # (or load from var)
      c = template.RequestContext(context,{'var':'value'}) # optional
      return t.render(c)    

@register.tag(name='custom_box', takes_context=True, context_class=RequestContext)
def box(parser, token):
    parts = token.split_contents()
    if len(parts) != 2:
        parts[1] = 'default_app' # is the default app that will be rendered.
    return GenericBox(parts[1])
于 2011-12-19T06:18:06.327 に答える