0

我现在正在学习 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 代码,而不是模板及其继承(我对此了解得足够多)。

最流行和最方便的方法是最可观的:)


正如我所见,您无法理解我,让我向您展示我希望从您那里听到的解决方案。

第一个解决方案是使用装饰器函数:

@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有更方便的实现方式。

先感谢您。

4

2 回答 2

1

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

新闻/模板标签/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 回答