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

如何在Django模板中访问不相关的模型?,django,templatetags,Django,Templatetags,我想使用一个应用程序来创建一个菜单,很容易与管理员界面编辑。大概是这样的: class Menu_item name = models.CharField() item_url = models.URLField() from django.db import models class Menu_choice(models.Model): name = models.CharField(max_length=30) def

我想使用一个应用程序来创建一个菜单,很容易与管理员界面编辑。大概是这样的:

class Menu_item
        name = models.CharField()
        item_url = models.URLField()
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
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 }
我的模板如下所示:

class Menu_item
        name = models.CharField()
        item_url = models.URLField()
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
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 }
{%extends base.html%}

div ID=nav

   {{ foo.navbar.? }}
/div

div ID=内容

   {% block content %}{% endblock %}
/div

我希望divnav包含基于上述模型的ul,但就是不知道如何实现这一点。看起来一个对象列表通用视图很不错,但是URL访问填充divcontent的模型的视图。有人有什么建议吗?有没有一种方法可以在没有URL的情况下访问通用视图


谢谢。

首先,在您的视图中,从数据库获取数据:

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>

我发现了一个解决办法。包含标签

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

以下是我所做的:

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

我将navbar.models更改为如下所示:

class Menu_item
        name = models.CharField()
        item_url = models.URLField()
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
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 }
这允许我在管理界面中为每个导航主层、辅助层等创建一个菜单选项对象 get_navbar.py如下所示:

class Menu_item
        name = models.CharField()
        item_url = models.URLField()
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
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>
注意:发送到包含标记的字符串周围的引号很重要。我花了相当长的时间试图让它工作,直到我明白了这一点


还要非常感谢dikamilo的帮助。

我不太清楚,在您的示例代码中,foo和navbar是什么关系?对不起!foo只是一个占位符。我从shell接收到这个视图函数的一个错误,并且没有呈现任何项目。它需要一个上下文处理器吗?此外,主内容块由通用视图呈现。哪种错误?我想你没有从django.shortcuts导入render\u到\u的响应。