如何处理Django中的其他块?

时间:2012-09-21 11:33:15

标签: python django templates django-views

我现在正在学习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有一种更方便的方式来实现它。

提前谢谢。

2 个答案:

答案 0 :(得分:1)

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

新闻/ 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开始,而不是complete one,因为它更简单,更符合大多数需求。

答案 1 :(得分:0)

也许你可以覆盖通用的详细信息视图(django.views.generic.DetailView)

继承视图类并覆盖get_context_data()将是您需要做的。