0

私は今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にはそれを実装するためのより便利な方法があると思います。

前もって感謝します。

4

2 に答える 2

1

わかりました、あなたの説明によると、私はあなたが目的のためにカスタマイズされたテンプレートタグを使うことができると思います。サイドバーに最近のニュースを追加したいとします(そして、ニュースと呼ばれるアプリがあり、すべてのニュースは記事と呼ばれるモデルに保存されています)

news / templatetags / news.py

from django import template
from django.db.models import get_model
register=template.Library();

@register.simple_tag(takes_context=True)
def get_latest_news(context,context_variable):
    context[context_variable]=get_model('News','Article').objects.order_by('-publish_date')[0,10]
    return ''

base.html

{% load news %}
{% block sidebar %}
    {% get_latest_news 'latest' %}
    {% for one in latest %}
        <p>{{one}}</p>
    {% endfor %}
{% endblock %}

完全なものよりもsimple_tagから始める方がはるかに単純で、ほとんどのニーズに適合します。

于 2012-09-21T11:40:47.570 に答える
0

ジェネリック詳細ビュー(django.views.generic.DetailView)をオーバーライドできるかもしれません

ビュークラスを継承し、get_context_data()をオーバーライドする必要があります。

于 2012-09-21T13:00:10.967 に答える