我写了一个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列表传递给主页模板。这是正确的方法还是有更好的方法?
答案 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 %}