2010-01-04 3 views
3

мне любопытно, как к лучшей практике способ обработки иметь что-то на каждой странице или на нескольких страницах без необходимости привязывать данные вручную на каждую страницу, как так:Как заставить что-то появляться на каждой странице в Django?

# views.py 

def page0(request): 
    return render_to_response(
     "core/index.html", 
     { 
      "locality": getCityForm(request.user), 
     }, 
     context_instance=RequestContext(request) 
    ) 

def page1(request): 
    return render_to_response(
     "core/index.html", 
     { 
      "locality": getCityForm(request.user), 
     }, 
     context_instance=RequestContext(request) 
    ) 
... 
def page9(request): 
    return render_to_response(
     "core/index.html", 
     { 
      "locality": getCityForm(request.user), 
     }, 
     context_instance=RequestContext(request) 
    ) 

Теперь я может придумать несколько способов сделать это, в том числе написать собственный Контекст или, возможно, некоторое промежуточное ПО и, конечно же, скопировать/вставить это назначение locality на каждую страницу ... Я просто не уверен в лучшем способе этого. Я почти уверен, что это не последнее.

ответ

16

Вы хотите context processor. Данные, которые они генерируют, включены в каждый контекст, созданный как RequestContext. Они идеально подходят для этого.

В сочетании с базовыми шаблонами, которые показывают общие вещи, вы можете избавиться от множества потребностей в копировании и вставке кода.

3

использование наследования в шаблонизатор:

имеют base.html, который включает общий код:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head> 
<link rel="stylesheet" href="style.css" /> 
<title>{% block title %}My amazing site{% endblock %}</title> 
</head> 

<body> 
<div id="sidebar"> 
    {% block sidebar %} 
    <ul> 
     <li><a href="/">Home</a></li> 
     <li><a href="/blog/">Blog</a></li> 
    </ul> 
    {% endblock %} 
</div> 

<div id="content"> 
    {% block content %}{% endblock %} 
</div> 
</body> 
</html> 

затем на каждой странице, которая нуждается в том, что общий код, просто:

{% extends "base.html" %} 
{% block title %}My amazing blog{% endblock %} 
{% block content %} 
{% for entry in blog_entries %} 
<h2>{{ entry.title }}</h2> 
<p>{{ entry.body }}</p> 
{% endfor %} 
{% endblock %} 

http://docs.djangoproject.com/en/dev/topics/templates/#id1

это в сочетании с контекстной обработкой устранит много дубликатов кода.

+0

Вы не рассматриваете проблему, которую он показывает в вопросе: код просмотра дублируется во многих представлениях. –

+1

это именно то, что наследует адреса кода вида. – bigjust

+0

Собственно, это все! Это воск для пола * и * десертная верхушка! Мы используем комбинацию контекстных процессоров и многоуровневую схему наследования шаблонов. Контекстные процессоры дают нам данные во всех наших представлениях, а наследование шаблонов означает, что данные попадают в нужное место на странице. –

2

Промежуточное программное обеспечение - это один из вариантов, или вы можете написать обычай template tag.

0

Чтобы сделать именно то, что вы просите, я бы просто определить функцию:

def foobar(req): 
    return render_to_response(
     "core/index.html", 
     { 
      "locality": getCityForm(req.user), 
     }, 
     context_instance=RequestContext(req) 
    ) 

положить его в какой-то модуль myfun и return myfun.foobar(request) везде, где это необходимо. Вероятно, вам понадобится еще несколько аргументов, но пока это не так просто, проще определить промежуточное ПО с использованием OOP, & c.

Смежные вопросы