如何在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 }}</a></li>
{% endfor %}
</ul>
注意:发送到包含标记的字符串周围的引号很重要。我花了相当长的时间试图让它工作,直到我明白了这一点
还要非常感谢dikamilo的帮助。我不太清楚,在您的示例代码中,foo和navbar是什么关系?对不起!foo只是一个占位符。我从shell接收到这个视图函数的一个错误,并且没有呈现任何项目。它需要一个上下文处理器吗?此外,主内容块由通用视图呈现。哪种错误?我想你没有从django.shortcuts导入render\u到\u的响应。