Найти - Пользователи
Полная версия: Django template
Начало » Django » Django template
1
chand
Привет. Извините если было.
У меня есть главный шаблон который я наследую. То есть в методе render_to_response я вызывает часть шаблона, а рендиреться весь и если мне потребуется в главном шаблоне вставить какой-то динамический контент, мне придется каждый раз его передавать в render_to_response. Возможно есть какой-то метод, который позволяет только один раз задать контент в шаблоне?
FishHook
>>>>То есть в методе render_to_response я вызывает часть шаблона
Это как? Научите.
Вообще не понятно нихрена, код шаблона в студию!
chand
Извините.

index.html
{% block content %}{% endblock %}<!-- content -->
<div id="menu"></div><!-- собсно меню, которое должно быть в в шаблоне-->

other.html

{% extends "index.html" %}
{% block content %}
    {% if posts %}
        {% for post in posts %}
        <a href="/post/view/id/{{ post.id }}">{{ post.title }}</a>
        <hr>
        {% endfor %}
    {% else %}
        empty
    {% endif %}
{% endblock %}

view.py
def index(self):
    posts = Posts.objects.all()
    return render_to_response('other.html',{'posts':posts})

То есть: если мне надо будет вывести меню, мне надо будет делать примерно так
menu = category()
return render_to_response('other.html',{'posts':posts,'menus':menu})

Что хочу: Чтобы каждый раз не вызывать функцию, которая возвращает меню, и передавать в шаблон, а где-то раз ее подключить и забыть о ней.
FishHook
От чего зависит какое меню будет отображаться?
Или оно одинаковое для всех вьюх?
Если одинаковое, то прям в базовом шаблоне его и опиши, а если оно меняется, то сделай несколько меню и include их в нужном шаблоне в засимости от контекста.
Как то так.
chand
FishHook
От чего зависит какое меню будет отображаться?
Или оно одинаковое для всех вьюх?
Если одинаковое, то прям в базовом шаблоне его и опиши, а если оно меняется, то сделай несколько меню и include их в нужном шаблоне в засимости от контекста.
Как то так.
Нет. Не зависит. Но оно генерируется динамически
FishHook
Говнокод, можете пинать, только небольно

class Menu(object):
    fields=((),()) # ((name, url_name), (name_1, url_name_1))
    params={} # {'territory_id':'territory.id', 'child_id':'child.id' }
    sumbenus={} # sumbenu={1:Submenu1Class, 4:Submenu2Class}
    is_vertical=False # nothing or 'vertical_menu'
    is_fixed=True
    @classmethod
    def get_menu_type(cls):
        return 'vertical_menu' if cls.is_vertical else ''
    @classmethod
    def get_block(cls):
        return 'sidebar' if cls.is_vertical else "menu"
    row_template='<li %s><a href="{%% url %s %s %%}?menu_entry=%s">%s</a></li>'
    @classmethod
    def get_template(cls):
        template=u'{%% block '+ cls.get_block() +u'%%} \
                  <ul class="nav '+cls.get_menu_type()+u'" style="border-style: solid; border-width: 1px; border-color: #FFF; border-radius: 2px; margin:2px"> %s </ul> \
                  {%% endblock %%}'
        return template
    @classmethod
    def get_params_str(cls):
        return ' '.join(['%s=%s' % (k,v) for k,v in cls.params.iteritems()])
    @classmethod
    def get_html(cls,*args, **kwargs):
        fields_dict=dict([(v,k) for k,v in enumerate([x[0] for x in cls.fields]) ])
        c=count(1)
        index=int(_thread_locals.request.GET.get('menu_entry', 0))
        res=[]
        for name, url in cls.fields:
            if not fields_dict[name] in cls.sumbenus:
                menu_entry=c.next()
                if menu_entry==index and cls.is_fixed:
                    cl='class="active"'
                else:
                    cl=''
                res.append(cls.row_template % (cl, url, cls.get_params_str(), menu_entry, name ))
            else:
                c.next()
                res.append(sub_menu(cls.sumbenus[fields_dict[name]], name))
        return cls.get_template() % ''.join(res)
def sub_menu(sub_menu_class, name):
    class SubMenuInstance(Menu):
        fields=sub_menu_class.fields
        params=sub_menu_class.params
        @classmethod
        def get_template(cls):
            template='<li class="dropdown" data-dropdown="dropdown"><a href="#" class="dropdown-toggle">' +name+ '</a> \
                 <ul class="dropdown-menu"> %s </ul></li>'
            return template
    return SubMenuInstance.get_html()
class MainInSub(Menu):
    fields=(
        (u'Основная очередь', 'sitizens_in_turn'),
        (u'Льготная очередь', 'sitizens_in_turn'),
           )
    params={'territory_id':'territory.id'}
class MainOffSub(Menu):
    fields=(
        (u'Основная очередь', 'sitizens_off_turn'),
        (u'Льготная очередь', 'sitizens_off_turn'),
        )
    params={'territory_id':'territory.id'}
class MainAddSub(Menu):
    fields=(
        (u'Новый гражданин', 'sitizens_add'),
        (u'Гражданин из БД', 'sitizens_rbdds_add'),
        )
    params={'territory_id':'territory.id'}
class MainMenu(Menu):
    fields=(
            (u'Добавить', 'sitizens_add'),
            (u'Граждане в очереди', 'sitizens_in_turn'),
            (u'Граждане снятые с очереди', 'sitizens_off_turn'),
            (u'Граждане получившие жилье', 'sitizens_with_home'),
           )
    params={'territory_id':'territory.id'}
    is_fixed = False
    sumbenus={
              0:MainAddSub,
              1:MainInSub,
              2:MainOffSub,
              } # sumbenu={0:Submenu1Class, 4:Submenu2Class}
class StatisticsSidebar(Menu):
    is_vertical = True
    is_fixed = False
    fields=(
        (u'Поставлены на учет', 'report1'),
        (u'Получили жильё(по категориям)', 'report2'),
        (u'Нуждаются в жилье(по категориям)', 'report3'),
        (u'Количество предоставленных помещений', 'report4'),
        (u'Количество граждан ожидающих жильё', 'report5'),
        (u'Количество граждан поставленных на учет в течении года (по категориям)', 'report6'),
        )
    params={'territory_id':'territory.id'}
def get_all_menuses():
    print MainMenu.get_html()
    print StatisticsSidebar.get_html()

-extends 'templates/base.html'
-block title
    Список граждан
-block description
    Список граждан
-block content
    {% include "templates/alphabet.html" %}
    -block list
    {% include "templates/pager.html"  %}
:python
    get_all_menuses()
FishHook
chand
FishHook
От чего зависит какое меню будет отображаться?
Или оно одинаковое для всех вьюх?
Если одинаковое, то прям в базовом шаблоне его и опиши, а если оно меняется, то сделай несколько меню и include их в нужном шаблоне в засимости от контекста.
Как то так.
Нет. Не зависит. Но оно генерируется динамически
Рекомендую юзать CBV, тогда ты напишешь базовый класс, в котором будешь помещать в контекст свои сгенерированные динамически менюшки, а все свои вьюхи наследуй от него и не заморачивайся.
chand
Спасибо, буду разбираться.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB