Общие компоненты в Django - PullRequest
1 голос
/ 19 июля 2009

Я знаю, что у меня могут быть такие общие вещи в django

<html>

{% include "header.html" %}

<div id = 'content'>
blah
</div>

{% include "footer.html" %}
</html>

но, похоже, мне нужно передавать данные footer.html и header.html каждый раз я включаю эти страницы?

Спасибо

Ответы [ 4 ]

3 голосов
/ 19 июля 2009

Наследование шаблонов в Django может быть именно тем, что вы хотите, с точки зрения того, чтобы не повторять включения и другие шаблоны.Если под «передачей данных» вы подразумеваете в контексте рендеринга, например, есть какие-то данные, которые вы всегда хотите поместить туда, проще всего сделать все ваши контексты рендеринга с помощью фабричной функции, которая заполняет общие части данных.

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

class ContextFactory(object):
  def __init__(self, **pervasive):
    self.pervasive = pervasive
  def makeContext(self, current):
    return dict(self.pervasive, **current)
  def registerPervasive(self, name, value):
    self.pervasive[name] = value

(и т. Д., Если вам нужно больше функциональности там), а затем создать экземпляродин экземпляр contextFactory в вашем соответствующем модуле.Там, где ваши представления в настоящее время могут отображаться с помощью контекстных диктов, таких как {'foo': bar}, вы вместо этого будете использовать contextFactory.makeContext({'foo': bar}), чтобы дать фабрике контекста шанс ввести любые пары имя / значение, которые в данный момент зарегистрированы в ней - и все, правда.

0 голосов
/ 30 июня 2012

Вам не нужно каждый раз передавать данные, если вы пишете свой собственный тег https://docs.djangoproject.com/en/1.4/howto/custom-template-tags/

  1. Напишите ваш собственный тег шаблона
  2. Ваша реализация тега может извлекать данные из базы данных, из заголовка HTTP-запроса и т. Д.
  3. Используйте свой тег в шаблоне base.html

Пример. Допустим, вы хотите иметь меню на каждом сайте. Создайте тег menu и используйте его следующим образом:

{% load my_tags %} <!-- don't forget to load your tags first -->
<html>

    {% menu %} <!-- your menu will be rendered here -->

    <div id = 'content'>
    blah
    </div>
</html>

Ваш тег может даже поместить новую переменную в контекст шаблона: https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#setting-a-variable-in-the-context

0 голосов
/ 25 июля 2009

См. С какой стати я должен передавать RequestContext во всех моих ответах?

Очевидно, это такая распространенная боль, что есть пакет, называемый django-раздражающий, чтобы исправить это (среди прочего).

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

Это также интересует меня как новичка в Django с фоном ASP.NET. Я заинтересован в создании «автономных» компонентов, которые могут быть включены в некоторые представления, но я не хочу добавлять данные для них в каждый метод представления, если они не понадобятся в представлении. Если мне нужно создать объект контекста, который знает о данных, необходимых для всех возможных включений, то все становится более взаимосвязанным.

Я заметил где-то еще, что это можно сделать с помощью пользовательского тега, который устанавливает данные для включенного шаблона. Мне кажется, это более чистое решение, даже если ему нужно больше программирования. Пример использования можно найти на http://docs.djangoproject.com/en/dev/ref/contrib/comments/#ref-contrib-comments-index

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...