更改为其他模板时链接消失

时间:2015-05-21 09:49:30

标签: python django templates

我试图在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])

我的所有观点。

2 个答案:

答案 0 :(得分:0)

您的模板会传递到当前视图的上下文中,因此您无法期望index()个视图的上下文在任何地方都可以神奇地使用。

在其他模板中提供此类数据的两种常见解决方案是

  1. 上下文处理器:
  2. 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

    这是一个非常简单的解决方案,但它也有一些缺点: - 即使对于不需要它的模板,也会调用上下文处理器 - 它很难知道在上下文中它们真正可用的内容以及它来自何处 - 您最终可能会遇到两个冲突的处理器,试图在上下文中设置相同的密钥 - 您最终可能会遇到处理器和视图之间的冲突(每个都尝试在上下文中设置相同的键)。

    1. 自定义模板标记:
    2. 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

希望这有帮助