0

私はそのような質問をしています。私はたくさんグーグルで検索し、decoratorsとについて読みましたmiddlewareが、私の質問をよりよく解決する方法を知りませんでした.

私は基本テンプレートbase.htmlとテンプレートtemplate1.htmlを持っており、template2.htmlそれらは拡張されていbase.htmlます。

base.htmltemplate1.htmlには、およびで必要な一般的なブロックがありtemplate2.htmlます。このブロックには動的データが含まれているため、各ビューでこのブロックのデータを取得してから、テンプレートをレンダリングする必要があります。

たとえば、私は 2 を持っていますviews:

@render_to("template1.html")
def fun_1(request):
data = getGeneralData()
#...getting other data
return {
        "data" : data,
        "other" : other_data,
}

@render_to("template2.html")
def fun_2(request):
data = getGeneralData()
#...getting other data
return {
        "data" : data,
        "other2" : other_data2,
}

したがってgetGeneralData、すべてのビューで関数viewsを呼び出す必要がありますか、ビューが独自のデータを取得する前に、それをgetGeneralData()取得してテンプレートにレンダリングする関数を作成できますか?general_data

コードの例を教えてください。または、より良い方法へのリンクを教えてください。

4

2 に答える 2

1

独自のコンテキスト プロセッサを作成し、そこから必要なコンテキスト データを返すことをお勧めします。

例 :

custom_context_processor.py

def ctx_getGeneralData(request):
    ctx = {}
    ctx['data'] = getGeneralData()
    return ctx

設定ファイルで、次のように更新TEMPLATE_CONTEXT_PROCESSORSします'custom_context_processor.ctx_getGeneralData'

于 2012-11-08T13:13:38.873 に答える
1

Django のクラスベースのビューの使用を検討したことがありますか? 最初は少し使いにくいですが、このようなことは非常に簡単です。クラスベースのビューを使用して関数ベースのビューを書き直す方法は次のとおりです。

# TemplateView is a generic class based view that simply
# renders a template.
from django.views.generic import TemplateView


# Let's start by defining a mixin that we can mix into any view that
# needs the result of getGeneralData() in its template context.


class GeneralContextDataMixin(object):
    """
    Adds the result of calling getGeneralData() to the context of whichever
    view it is mixed into.
    """

    get_context_data(self, *args, **kwargs):
        """
        Django calls get_context_data() on all CBVs that render templates.
        It returns a dictionary containing the data you want to add to
        your template context.
        """
        context = super(GeneralContextDataMixin, self).get_context_data(*args, **kwargs)
        context['data'] = getGeneralData()
        return context


# Now we can inherit from this mixin wherever we need the results of
# getGeneralData(). Note the order of inheritance; it's important.


class View1(GeneralContextDataMixin, TemplateView):
    template_name = 'template1.html'


class View2(GeneralContextDataMixin, TemplateView):
    template_name = 'template2.html'

もちろん、Rohan が言ったように、独自のコンテキスト プロセッサを作成することもできます。実際、このデータをすべてのビューに追加したい場合は、この方法をお勧めします。

最終的に何をするにしても、クラスベースのビューを検討することを強くお勧めします。それらは、多くの繰り返し作業を非常に簡単にします。

参考文献:

于 2012-11-08T14:28:17.953 に答える