Я нашел решение. Теги включения.
Я создал тег включения, который представляет собой простой пользовательский тег шаблона (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)
Создайте шаблон navbar.html:
<ul><br>
{% for menu_item in navbar %}
<li><a href="{{ menu_item.item_url }}">{{ menu_item.name }}</a></li>
{% endfor %}
</ul>
Наконец, я вставил в свой base.html следующее:
<code>{% load get_navbar %}
А где я хочу первичную навигацию:
{% get_navbar "primary" %}
Примечание: кавычки вокруг строки, которую вы отправляете в тег включения, очень важны Я потратил смехотворно много времени, пытаясь заставить его работать, прежде чем понял это.
Также большое спасибо dikamilo за помощь.