我现在正在学习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有一种更方便的方式来实现它。
提前谢谢。
答案 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()将是您需要做的。