Как получить доступ к несвязанным моделям в шаблоне Django? - PullRequest
0 голосов
/ 20 июля 2010

Я хочу использовать приложение для создания меню, которое легко редактировать с помощью интерфейса администратора. Примерно так:

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

Мой шаблон выглядит примерно так:

{% extends base.html%}

div ID = "nav"

   {{ foo.navbar.? }}

/ дел

div ID = "Содержимое"

   {% block content %}{% endblock %}

/ дел

Я хочу, чтобы div # nav содержал ul на основе описанной выше модели, но просто не могу понять, как этого добиться. Кажется, что универсальное представление object_list было бы замечательно, но URL обращается к представлению для модели, которая заполняет содержимое div #. У кого-нибудь есть предложения? Есть ли способ получить общий вид без URL-адреса?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 07 августа 2010

Я нашел решение. Теги включения.

Я создал тег включения, который представляет собой простой пользовательский тег шаблона (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 }}&lt/a>&lt/li>
    {% endfor  %}
    </ul> 
Наконец, я вставил в свой base.html следующее:
<code>{% load get_navbar %}

А где я хочу первичную навигацию:

{% get_navbar "primary" %}

Примечание: кавычки вокруг строки, которую вы отправляете в тег включения, очень важны Я потратил смехотворно много времени, пытаясь заставить его работать, прежде чем понял это.

Также большое спасибо dikamilo за помощь.

0 голосов
/ 21 июля 2010

Сначала, по вашему мнению, получите данные из 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>
...