Django的树形菜单应用。
项目描述
这是一个简单通用的Django树形菜单系统,具有易于使用的管理界面。它涵盖了构建树形菜单的所有基本要素,应该足够用于许多项目。如果您需要为菜单项添加一些特殊行为,它也易于扩展。
django-treemenus与Django 1.0及以上版本以及Python 2.5及以上版本兼容。
安装
安装官方版本
django-treemenus可在PyPI上找到,并可以使用Pip安装
pip install django-treemenus
或者,官方源代码发布可以在https://pypi.python.org/pypi/django-treemenus找到
下载.zip发行文件,解压它。其中包含一个名为setup.py的脚本。运行以下命令
python setup.py install
…然后软件包将自动安装。
安装开发版本
如果您希望定期更新Django Tree Menus以获取最新的错误修复和改进,在官方版本中包含之前,请使用git clone
git clone https://github.com/jphalip/django-treemenus
然后将treemenus文件夹添加到您的PYTHONPATH或符号链接(如果是Windows系统,则是junction),例如在Python的site-packages目录下。
基本使用
要构建一个菜单,登录到管理界面,然后在Treemenus应用程序部分下点击“菜单”,然后点击“添加菜单”。为新菜单命名并保存。
然后,要创建菜单项,点击菜单列表中的菜单。您将在页面底部看到一张表格,其中只有一个条目:菜单的根。点击“添加条目”,选择其父级(显然,因为这是您创建的第一个条目,您只能选择根)。填写条目的详细信息并点击“保存”。新的条目现在显示在表格中。现在继续创建尽可能多的分支,以构建整个树形菜单的结构。
当您从管理界面完成菜单的构建后,您必须编写适当的模板来在您的网站上显示菜单(以下将说明)。
属性和方法
正如您所猜想的,您可以操作两种类型的对象:菜单和菜单项。在本节中,我介绍了它们的属性和方法,您可以在模板中使用它们。
自定义/扩展
上面列出的属性和方法为树状菜单提供了基本的行为。如果您觉得不够,还可以通过扩展菜单项定义来添加自定义行为。为此,您需要创建一个模型类,该类将包含您菜单项的所有额外属性。
为了说明这一点,假设您想向您的菜单项添加一个published属性,这样只有当published设置为True时,它们才会显示在您的网站上。
为此,创建一个新的应用(让我们称其为menu_extension),具有以下结构
menu_extension __init__.py models.py forms.py
然后,在menu_extension.models.py中添加以下内容
from django.db import models from treemenus.models import MenuItem class MenuItemExtension(models.Model): menu_item = models.OneToOneField (MenuItem, related_name="extension") published = models.BooleanField(default=False)
您的扩展对象需要有一个属性menu_item,它是一个指向菜单项对象的唯一链接。这就是扩展成为可能的原因。然后您会注意到我们的属性published,您可以在那里自由添加任何其他属性来自定义您的菜单项。
然后您需要创建数据库表来存储您的扩展数据,通过将menu_extension添加到Django项目的INSTALLED_APPS设置,然后从项目的根目录运行以下命令
python manage.py syncdb
现在,您需要指定一个表单,让您可以从管理界面编辑这些额外属性。在您的项目的admin.py或您的扩展菜单应用中的admin.py中,添加以下内容
from django.contrib import admin from treemenus.admin import MenuAdmin, MenuItemAdmin from treemenus.models import Menu from menu_extension.models import MenuItemExtension class MenuItemExtensionInline(admin.StackedInline): model = MenuItemExtension max_num = 1 class CustomMenuItemAdmin(MenuItemAdmin): inlines = [MenuItemExtensionInline,] class CustomMenuAdmin(MenuAdmin): menu_item_admin_class = CustomMenuItemAdmin admin.site.unregister(Menu) # Unregister the standard admin options admin.site.register(Menu, CustomMenuAdmin) # Register the new, customized, admin options
就这样!现在,当创建或编辑菜单项时,您将看到一个包含所有扩展属性的内联表单(在这个例子中,是published复选框)。
现在,如果您想在模板中使用 published 属性,您需要使用菜单项的 extension 方法,如下所示
{% if menu_item.extension.published %} <li><a href="{{ menu_item.url }}">{{ menu_item.caption }}</a></li> {% endif %}
现在,只有当菜单项的 published 复选框被勾选时,您的菜单项才会显示。
使用这种技术,您显然可以扩展菜单项以包含您想要的任何属性。其他示例可能包括您想要为某些菜单项添加特殊的CSS样式,或者使它们仅在用户登录时显示等。只需在扩展模型中添加属性,并在模板中使用它们来创建特殊的行为。请参阅“技巧和技巧”部分以获取更多想法。
技巧和技巧
在本节中,我将提供一些关于使用或扩展菜单的示例。这些示例可能仅涵盖您自己的某些特定需求,或者至少可以激发您并帮助您充分利用菜单。
国际化
如果您使用 Django 国际化 模块,使您的菜单多语言化非常简单。您可以做的就是在菜单项的 caption 属性上应用翻译。例如
{% load i18n %} ... <li><a href="{{ menu_item.url }}">{% trans menu_item.caption %}</a></li>
然后,手动在您的 *.po 文件中添加翻译条目。
如果您使用更复杂或定制的翻译系统,您可以简单地定义您的扩展类(或者如果您还没有创建,则创建它)并使用一个管理翻译的方法,例如
class MenuItemExtension(models.Model): menu_item = models.OneToOneField (MenuItem, related_name="extension") ... def translation(): translation = do_something_with(self.menu_item.caption) return translation
然后在您的模板中
<li><a href="{{ menu_item.url }}">{% trans menu_item.extension.translation %}</a></li>
登录限制
如果您想要使某些菜单项私有,并且仅对已登录用户可用,这是很简单的事情!只需像以下那样定义您的扩展类(或者如果您还没有创建,则创建它)
class MenuItemExtension(models.Model): menu_item = models.OneToOneField (MenuItem, related_name="extension") protected = models.BooleanField(default=False) ...
然后在您的模板中
{% if menu_item.extension.protected %} {% if user.is_authenticated %} <li><a href="{{ menu_item.url }}">{{ menu_item.caption }}</a></li> {% endif %} {% else %} <li><a href="{{ menu_item.url }}">{{ menu_item.caption }}</a></li> {% endif %}
(假设上下文变量‘user’代表当前已登录用户)
这就完成了!
请在 https://github.com/jphalip/django-treemenus/issues 上记录任何问题或错误报告。
享受吧!
Julien Phalip(项目开发者)
项目详情
django-treemenus-0.9.2.tar.gz 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 36cb1ac07fef8d09cd756a567e00ac553104489feeab3c1311e665b7c427695f |
|
MD5 | 5efc5dd242533aa0b4a9b92a9e9f24a3 |
|
BLAKE2b-256 | 06b7b486e8e0a73f132faf264082407edddbb278356e20ba0a415250bf02194e |