【问题标题】:How to use django-sitetree? 2.0如何使用 django-sitetree? 2.0
【发布时间】:2011-10-21 21:38:34
【问题描述】:

我在使用django-sitetree(0.5.1 版)使用 Django 生成导航菜单时遇到了烦人的问题。出于测试目的,我尝试配置 django-sitetree 为“投票”应用程序 (official Django tutorial) 创建一个站点树。我根据some instructions answering a prior question 配置它 - 但我在使用 url 模式时遇到了问题,这对我不起作用。

所以这些是我的“投票”的 url 模式,它们包含在 /polls 中(我不使用尾部斜杠):

urlpatterns = patterns('polls.views',
    (r'^$', 'index'),
    (r'^/(?P<poll_id>\d+)$', 'detail'),
    (r'^/(?P<poll_id>\d+)/results$', 'results'),
    (r'^/(?P<poll_id>\d+)/vote$', 'vote'),
)

我只通过 Django admin 像这样配置了视图 indexdetail

Title                        URL
My site                      /
+ Polls                      polls.views.index
  + Poll {{ poll.question }  polls.views.detail poll.id

在我的主页/ 上使用{% sitetree_menu from "maintree" include "trunk" %} 产生以下输出

Title                        URL
My site                      /
+ Polls                      /polls
  + Poll                     #unresolved

但我期待的是:

Title                        URL
My site                      /
+ Polls                      /polls
  + Poll foo                 /polls/1
  + Poll Test #2             /polls/2

我已经尝试了几件事,例如在 urls.py 中使用命名视图(如文档中所建议的那样),但我什至没有得到一个简单的 {% sitetree_url %} 使用参数。很遗憾,除了上述答案的一些副本之外,网络上没有任何帮助。如果有人帮助我提供更详细的信息,我将不胜感激。感谢您的帮助!

【问题讨论】:

    标签: django navigation sitemap breadcrumbs


    【解决方案1】:

    目前,应用程序无法满足您的期望,即无法确定您的“投票 {{ poll.question }”描述了多少个民意调查,以及您要显示哪些民意调查在菜单中。

    我应该试着考虑一下这个功能,但坦率地说,我不认为在菜单中放置几十个投票是个好主意。

    不过,有几种方法可以解决它:

    1. 为您需要的每个投票手动创建条目;

    2. 在创建新轮询时将轮询条目添加到树中,例如使用信号和模型的 API。可以看到,和选项1一样,但是是自动化的;

    3. 不要在菜单和站点树中显示“投票 {{ poll.question }”,而只在面包屑中显示。因此考虑通过民意调查列表导航的“民意调查”页面。在面包屑的情况下,“投票 {{ poll.question }”将根据给定规则在池页面上解析为完整标题。


    对于 hardyharzen,谁在 cmets 中询问关于 2 号的示例:

    假设我们仍在谈论民意调查。将以下代码放入 polls app models.py 文件中。

    请注意,此代码将树项添加到 id 为 1 的站点树中,在 id 为 10 的树枝上,并期望 Poll 模型定义 get_absolute_url() 方法。

    from django.db.models.signals import post_save  
    from django.dispatch import receiver  
    from sitetree.models import TreeItem
    

    -

    @receiver(post_save, sender=Poll)
    def on_poll_add(instance, created, **kwargs)
        if created:
            tree_item = TreeItem(title=instance.title, tree_id=1, 
                parent_id=10, url=instance.get_absolute_url())  
            tree_item.save(force_insert=True)
    

    【讨论】:

    • [django-newbie-speaking]:请您详细说明 2.?这听起来像是一个优雅的解决方案。
    • 感谢您的详细解答!我已经发现在菜单或站点树中使用 Poll 并不是很聪明,并且使用面包屑导航效果很好。我认为不需要像我经常尝试的那样做事情。
    • 我有几个小问题:在使用站点树或菜单时,有没有办法将嵌套深度限制为给定的数字?而且,如果我在基本模板中使用面包屑,在使用未定义 treeItem 的应用程序扩展它时,我总是会收到 TemplateError。如何避免这种情况?如果您可以在模板中使用诸如 treeitem_available 之类的布尔值进行异常处理,那就太好了。
    • @purefanatic 您可以覆盖内置模板以限制渲染树的深度。为避免 TemplateErrors,您可以将 sitetree_breadcrumbs 标签包装在 block 标签中,对于未定义树项目的应用,您可以将其替换为空的 block 标签。这实际上是模板杂耍的问题。
    • 如您所见,我对 Django 没有太多经验。我正在尝试更多地了解它。再次感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 2018-06-05
    • 2018-09-25
    • 2019-01-07
    • 1970-01-01
    相关资源
    最近更新 更多