0

アプリを使って、管理インターフェースで簡単に編集できるメニューを作成したいと思います。このようなもの:

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なしで汎用ビューにアクセスする方法はありますか?

ありがとうございました。

4

2 に答える 2

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>
于 2010-07-21T16:35:16.660 に答える
0

私は解決策を発見しました。包含タグ。

私がしたことは、単純なカスタム テンプレート タグに相当する包含タグを作成することでした (django はショートカットを提供します!)。

これが私がしたことです:

  • views.py を無視 - この場合は使用されません
  • init .py と get_navbar.py (またはタグにしたいもの)を含む「templatetags」という名前のサブディレクトリをアプリのディレクトリに作成します。

    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>
    {% 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にも感謝します。

  • 于 2010-08-07T18:44:57.077 に答える