我试图在Django中创建一个博客网站。我几乎是一个初学者,所以这个问题可能很愚蠢,但我不知道如何解决这个问题。
我的标题中有一个主导航。在base.html模板中,我在菜单中创建了几页的链接。在同一个模板中,我在侧边栏中有一个类别列表,这些列表是列出该类别中所有帖子的链接。
当我转到任何其他模板时(当我点击任何这些链接时),即使我扩展base.html模板,链接也会消失。无论模板如何,我如何将它们保留在原位?对于这样的事情,常见的做法是什么?
感谢阅读! 干杯!
编辑:代码:
<nav>
<ul>
<li><a href="{% url 'index' %}">HOME</a></li>
{% for link in links %}
<li><a href="{% url 'page' link.slug %}">{{ link.title }} </a></li>
{% endfor %}
</ul>
</nav>
这是在base.html中,但这些链接(硬编码的Home链接除外)在其他只更改内容块的模板中消失。
编辑2: 这是基地的观点:
def index(request):
posts = Post.objects.all()
links = Page.objects.filter(menu='Y')
categories = Category.objects.all()
return render(request, 'main/base.html', {'posts': posts,
'links': links,
'categories': categories,
})
解: 谢谢大家的帮助。这是我使用的解决方案:
from django.template import RequestContext
def base_links(request):
header_links = Page.objects.filter(menu='Y')
sidebar_categories = Category.objects.all()
return {
'links': header_links,
'categories': sidebar_categories,
}
然后我补充道:
context_instance = RequestContext(request, processors=[base_links])
我的所有观点。
答案 0 :(得分:0)
您的模板会传递到当前视图的上下文中,因此您无法期望index()
个视图的上下文在任何地方都可以神奇地使用。
在其他模板中提供此类数据的两种常见解决方案是
https://docs.djangoproject.com/en/1.8/ref/templates/api/#subclassing-context-requestcontext https://docs.djangoproject.com/en/1.8/ref/templates/api/#writing-your-own-context-processors
这是一个非常简单的解决方案,但它也有一些缺点: - 即使对于不需要它的模板,也会调用上下文处理器 - 它很难知道在上下文中它们真正可用的内容以及它来自何处 - 您最终可能会遇到两个冲突的处理器,试图在上下文中设置相同的密钥 - 您最终可能会遇到处理器和视图之间的冲突(每个都尝试在上下文中设置相同的键)。
https://docs.djangoproject.com/en/1.8/howto/custom-template-tags/
在您的情况下,如果您计划在网站的每个页面上以相同的方式呈现相同的数据,inclusion_tag()
是明显的选择。
就我而言,我发现自定义标签比上下文处理器更易于维护,并且使用inclusion_tag()
快捷方式,它们与上下文处理器一样容易设置。
答案 1 :(得分:-1)
在django每个&#34;页面&#34;是一种观点。您的index()
功能是您主页的视图,我打赌您有一个blog_post()
或类似的内容可以呈现帖子
每个视图都必须定义要使用的模板,并传递渲染它的模板所需的上下文(变量)。您的基本模板有一个需要links
变量的菜单,因此每个视图都会呈现扩展基本模板的模板必须传递links
变量在上下文中。
简单来说:)你需要将links
变量传递到帖子视图中的上下文
小建议:不要将功能用作视图。最好使用Class Based Views
希望这有帮助