Django应用程序将内容添加到同一页面

时间:2014-09-24 06:28:13

标签: python django

我写了一个Django网站,其中包含一个简单的主页,其中包含以下菜单项的列表:

  • 主页
  • 用户
  • 联系

我现在正在为这个网站开发一个可选的Django应用程序。安装后,我希望在主页上添加一个名为" Extras"的额外菜单项。

在Django中实现此类事情的最佳方式是什么?

我考虑过将类似的内容添加到我的settings.py文件中:

MENU_ITEMS = [
    'Home',
    'Users',
    'Contact',
]

然后在我的应用程序__init__.py中,我会做这样的事情:

from django.conf import settings
settings.MENU_ITEMS.append('Extras')

然后,views.py文件会将此MENU_ITEMS列表传递给主页模板。这是正确的方法还是有更好的方法?

1 个答案:

答案 0 :(得分:0)

我会从经验中给你一个提示:如果可能的话,不要在运行时混淆设置,这些变量是全局的,改变它们可能会导致一些讨厌的错误。我不确定但是使用那些代码你可能会得到类似的东西:

MENU_ITEMS = [
    'Home',
    'Users',
    'Contact',
    'Extras',
    'Extras',
    'Extras',
    'Extras',
]

同样,我不确定,但你不需要弄乱你的设置来实现你的目的。

更简洁的方法是让您的视图管理您的视图。如果你想要的只是一个菜单,创建一个基本模板并将菜单放在那里,然后从中扩展。如果您想在将来添加任何内容,则只需要更改该部分(如果您想根据用户或其他内容渲染某些部分,可以在那里添加条件)。 有关详细信息,请参阅django docs

例如:

<div class="header navbar">
      <div class="container">
        <a class="navbar-brand" href="/">{% endraw %}{{ cookiecutter.project_name }}{% raw %}</a>
        <ul class="nav navbar-nav">
          <li class="active"><a href="{% url 'home' %}">Home</a></li>
          <li><a href="{% url 'about' %}">About</a></li>

          {% if request.user.is_authenticated %}
            <li><a href="{% url 'users:detail' request.user.username  %}">{% trans "My Profile" %}</a></li>
            <li><a href="{% url 'account_logout' %}">{% trans "Logout" %}</a></li>
          {% else %}
            <li><a href="{% url 'account_signup' %}">{% trans "Sign Up" %}</a></li>
            <li><a href="{% url 'account_login' %}">{% trans "Log In" %}</a></li>
          {% endif %}
        </ul>
      </div>
    </div>
    {% block content %}
    {% endblock content %}

如果在基本模板中定义了此项,则扩展它的页面将默认显示,仅覆盖块内容所在的部分。如果您想在导航栏中添加其他链接,请执行以下操作:

<li class="active"><a href="{% url 'my_other_url' %}">My new item</a></li>

您可以像往常一样在urls.py中定义“my_other_url”。 这是做我认为你想做的事情的正确方法。您让模板处理您的网站外观,不要使用您的控制器混淆视图(如在mvc中)。

如果你想让额外的项目成为可选项,你只需要向模板发送一个标志或其他内容并使用:

{% if flag %}
<li class="active"><a href="{% url 'my_other_url' %}">My new item</a></li>
{% endif %}