【问题标题】:How do I access unrelated models within a Django template?如何在 Django 模板中访问不相关的模型?
【发布时间】:2010-07-20 18:19:11
【问题描述】:

我想使用一个应用程序来创建一个易于使用管理界面进行编辑的菜单。像这样的:

class Menu_item
        name = models.CharField()
        item_url = models.URLField()

我的模板看起来像这样:

{% 扩展 base.html %}

div ID="导航"

   {{ foo.navbar.? }}

/div

div ID="内容"

   {% block content %}{% endblock %}

/div

我希望 div#nav 包含基于上述模型的 ul,但只是不知道如何实现这一点。看起来 object_list 通用视图会很棒,但是 URL 会访问填充 div#content 的模型的视图。有没有人有什么建议?有没有办法在没有 URL 的情况下访问通用视图?

谢谢。

【问题讨论】:

  • 不确定我是否理解,您的示例代码中与 foo 和 navbar 有什么关系?
  • 对不起! foo 只是一个占位符。

标签: django templatetags


【解决方案1】:

首先,在你看来,从 db 中获取数据:

def index(request):
    navbar = Menu_item.objects.all()
    return render_to_response( 'you_template.html', 
        { 'navbar': navbar }, context_instance = RequestContext (request ) )

在模板中:

<div id="nav">
    <ul>
    {% for i in navbar %}
        <li><a href="{{ i.item_url }}">{{ i.name }}</a></li>
    {% endfor  %}
    </ul>
</div>

【讨论】:

  • 我从 shell 接收到这个视图函数的错误(并且没有呈现任何项目)。它需要上下文处理器吗?此外,主要内容块由通用视图呈现。
  • 什么样的错误?我认为您没有“从 django.shortcuts 导入 render_to_response”。
【解决方案2】:

我发现了一个解决方案。包含标签。

我所做的是创建一个包含标签,相当于一个简单的自定义模板标签(django 为您提供了一个快捷方式!)。

这是我所做的:

  • 忽略 views.py - 在这种情况下不会使用它
  • 在应用程序的目录中创建一个名为“templatetags”的子目录,其中包含 init.py 和 get_navbar.py(或任何您想要的标签):

    mysite/
       navbar/
            templatetags/
                __ init__.py (without the space befire init)
                get_navbar.py
    
  • 我将 navbar.models 更改为如下所示:
    from django.db import models
    
    
    class Menu_choice(models.Model):
            name = models.CharField(max_length=30)
    
            def __unicode__(self):
                    return self.name
    
    class Menu_item(models.Model):
            name = models.CharField(max_length=20)
            navbar = models.ForeignKey(Menu_choice)
            item_url = models.CharField(max_length=200)
            item_desc = models.CharField(max_length=30)
    
            def __unicode__(self):
                    return self.name
    

    这允许我在管理界面中为每一层导航(主要、次要等)创建一个 Menu_choice 对象

  • get_navbar.py 看起来像这样:
    from navbar.models import Menu_choice, Menu_item
    from django import template
    
    register = template.Library()
    
    @register.inclusion_tag('navbar/navbar.html')
    def get_navbar(navBar):
            navbar = Menu_item.objects.filter(navbar__name=navBar)
            return { "navbar": navbar }
    

    (注意导航栏而不是导航栏)

  • 创建 navbar.html 模板:
        <ul>
    {% for menu_item in navbar %} <li><a href="{{ menu_item.item_url }}">{{ menu_item.name }}&lt/a>&lt/li> {% endfor %} </ul>
  • 最后,我将以下内容插入到我的 base.html 中:
    {% load get_navbar %}

    以及我想要主导航的位置:

    {% get_navbar "primary" %}

    注意:您发送到包含标签的字符串周围的引号很重要。在我弄清楚之前,我花了很长的时间试图让它工作。

    也非常感谢 dikamilo 的帮助。

  • 【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多