如何在Django模板中访问不相关的模型?

时间:2010-07-20 18:19:11

标签: django templatetags

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

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

我的模板看起来像这样:

  

{%extends base.html%}

     

div ID =“nav”

   {{ foo.navbar.? }}
     

/ DIV

     

div ID =“Content”

   {% block content %}{% endblock %}
     

/ DIV

我希望div#nav包含基于上述模型的ul,但却无法弄清楚如何实现这一点。似乎object_list通用视图会很棒但是,URL会访问填充div #content的模型的视图。有没有人有什么建议?有没有办法在没有URL的情况下访问通用视图?

谢谢。

2 个答案:

答案 0 :(得分:0)

首先,在您查看中,从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>

答案 1 :(得分:0)

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

我所做的是创建一个包含标记,相当于一个简单的自定义模板标记(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而不是导航栏)

  • 创建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的帮助。