私は今Djangoを学んでいて、簡単な質問があります:Djangoで追加のページブロック(メインコンテンツブロック以外)を処理する方法は?
私が何を意味するのか説明させてください。「news.views.view」ビュー関数を参照するページ「/news/view/12」があるとします。このページでは、ナビゲーションメニュー、最近のブログ投稿、いくつかの情報を含むフッターなどのブロックを表示します。言い換えれば、これらのブロックはサイトのすべてのページに配置されます。そしてもちろん、ニュースアイテムのコンテンツを含むメインコンテンツブロックがあります。
このビュー関数( "news.views.view")では、1つのニュースのビューだけを処理するPythonコードが必要です。
def view(request, id):
news_item = News.objects.get(pk=id)
return render(request, 'news/view.html', {"item" : news_item})
では、別のブロックをどのように処理できますか?それらのデータをフェッチしてから、テンプレートに割り当てますか?
テンプレートとその継承についてではなく、DjangoのどこかにあるPythonコードを意味します(私はそれについて十分に知っています)。
最も人気があり便利なアプローチは最も評価できます:)
あなたが私を理解できないのを見ると、私があなたから聞くことを期待している解決策をあなたに見せましょう。
最初の解決策は、デコレータ関数を使用することです。
@load_navigation
@load_recent_news
def view(request, id):
news_item = News.objects.get(pk=id)
return render(request, 'news/view.html', {"item" : news_item})
2番目の解決策は、テンプレートでPython関数を直接呼び出すことです。
{% block recent_news %}
{% call "news.views.recent_news" %}
{# this will call a python function which will return rendered template with recent news #}
{% endblock %}
そして3番目の解決策はdjangoミドルウェアを使用することです。
しかし、実を言うと、私はこれらのアプローチのどれも好きではありません。djangoにはそれを実装するためのより便利な方法があると思います。
前もって感謝します。