Python 如何处理Django中的附加块?

Python 如何处理Django中的附加块?,python,django,templates,django-views,Python,Django,Templates,Django Views,我现在正在学习Django,有一个简单的问题:如何在Django中处理额外的页面块(除了主内容块之外) 让我解释一下我的意思。假设我们有一个页面“/news/view/12”,它指的是“news.views.view”视图函数。 在这个页面上,我将有一些块,比如导航菜单、最近的博客文章、带有一些信息的页脚等等。换句话说,这些块将被放置在网站的每个页面上。 当然,还有一个主要的内容块,包含新闻项目的内容 在这个视图函数(“news.views.view”)中,我希望有一个Python代码来精确地处

我现在正在学习Django,有一个简单的问题:如何在Django中处理额外的页面块(除了主内容块之外)

让我解释一下我的意思。假设我们有一个页面“/news/view/12”,它指的是“news.views.view”视图函数。 在这个页面上,我将有一些块,比如导航菜单、最近的博客文章、带有一些信息的页脚等等。换句话说,这些块将被放置在网站的每个页面上。 当然,还有一个主要的内容块,包含新闻项目的内容

在这个视图函数(“news.views.view”)中,我希望有一个Python代码来精确地处理一条新闻的视图,而不是其他任何内容:

def view(request, id):
    news_item = News.objects.get(pk=id)
    return render(request, 'news/view.html', {"item" : news_item})
那么,我如何处理另一个块:获取它们的数据,然后将其分配给模板

我指的是Django中的Python代码,而不是模板及其继承(我对它了解得足够多)

最受欢迎和最方便的方法是最值得注意的:)


当我看到你不理解我时,让我向你展示我期望从你那里听到的解决方案

第一种解决方案是使用decorator函数:

@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})
第二种解决方案是直接在模板中调用python函数:

{% block recent_news %}
    {% call "news.views.recent_news" %} 
    {# this will call a python function which will return rendered template with recent news #}
{% endblock %}
第三种解决方案是使用django中间件

但是,说实话,我不喜欢这些方法中的任何一种。我相信django有一种更方便的方法来实现它


提前谢谢。

好的,根据您的描述,我想您可以使用定制的templatetags。 假设您想在侧边栏中添加最近的新闻(您有一个名为news的应用程序,而所有新闻都存储在一个名为Article的模型中)

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 %}
{%loadnews%}
{%块边栏%}
{%get_latest_news'latest%}
{对于最新%%中的一个,}
{{1}}

{%endfor%} {%endblock%}

最好从开始,因为它更简单,并且适合大多数需要。

也许您可以覆盖通用详细视图(django.views.generic.DetailView)


继承视图类并重写get\u context\u data()将是您需要执行的操作。

这可能会对您有所帮助。对不起,这不是我要说的。我需要知道如何用数据填充模板。所以我说的是Django中的Python代码,而不是模板。那么需要更多的解释吗,“处理另一个块”是什么意思?你能举个例子吗?当然可以。假设我们在站点的每个页面上都有3个块:顶部导航菜单、内容区域、最近新闻的页脚。因此,顶部的导航菜单和底部的最新新闻(页脚)将出现在每个页面上,只有内容将根据请求的页面进行更改。关键是如何用DB中的数据填充这两个块?怎么做?如何在查看功能之外从DB中获取最新的新闻项和导航菜单项(如上所述)?实际上,这不是我要说的。我知道模板继承。陷阱是如何用数据库中的数据填充它?如何获取最近的博客文章、导航菜单页面,然后将其放入模板中?谢谢,我想我可以接受这种方法。但是直接在模板中调用python函数并不是一种完美的方法。可能有一些方法可以不使用模板来实现这一点吗?另外,您必须在templatetags脚本中保留数据获取函数。我认为它们不是专门为这个目的而制造的。我假设所有这些从数据库获取数据并处理数据的函数都必须在模型层中。如果不想在模板中做任何事情,您应该研究一下中间件。尽管如此,我还是想知道是否有一种“完美的方法”,因为我从Django自己的评论框架中学习到了这种方法,如果你认为Django本身不符合他们自己的标准:)我相信它在语义上是清晰的,并且是有意义的,因为当你碰到这些模板标签时,你可以很容易地看到数据来自何处。在外部视图或中间件中将它们组合在一起只会将所有内容搅动在一起。模板是用来做它的工作的,而不是严格地保持干净,请在“哲学和局限性”中查看这一点