В Django, где лучшее место для размещения коротких фрагментов данных в формате HTML? - PullRequest
9 голосов
/ 29 сентября 2008

Этот вопрос относится (но, возможно, не совсем так):

Есть ли в Django помощники по HTML?

Моя проблема заключается в следующем: в Django я постоянно воспроизводлю базовое форматирование низкоуровневых объектов базы данных. Вот пример:

У меня есть два класса, Персона и Адрес. Есть несколько адресов для каждого человека, настройте likeo (в соответствующих models.py )

class Person(models.Model):
  ...

class Address(models.Model):
  contact = models.ForeignKey(Person)

Теперь, когда я смотрю на Человека, я хочу видеть все его Адреса. Итак, предположим, что Persons / views.py имеет что-то похожее:

def detail(request, person_id):
   person = get_object_or_404( Person, pk=person_id )
   return render_to_response('persons/details.html',
      { 'title' : unicode(person), 'addresses': person.address_set.all() } )

И у меня есть шаблон, person / details.html , с кодом, например, вот так:

{% extends "base.html" %}

{% for address in addresses %}
<b>{{ address.name }}</b>
  {{ address.type }} <br>
  {{ address.street_1 }}<br>
  {{ address.street_2 }}<br>
  {{ address.city }} {{ address.stateprov }} {{ address.postalcode }}<br>
  {{ address.country }}
  <hr>
{{ endfor }}

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

. В других случаях я не хочу отображать улицу_2 (или
после нее). Скажем так, есть фундаментальная логика, которую я хочу выразить, что мне еще больше не хочется копаться в блоке и копировать!

Я хочу персон / details.html , например, со следующим:

{% extends "base.html" %}
{% for address in addresses %} 
  {% address.as_html4 %}
{% endfor %}

А если мне нужна встроенная таблица, то что-то нравится (наверное!):

{% extends "base.html" %}
<table><tr>
{% for address in addresses %}
  <tr><td> {% address.as_html4 </td><td> %} </td></tr>
{% endfor %}
</table>

Тогда возникает вопрос: где лучше всего разместить форматирование? Логика?

У Django, кажется, есть следующие (вероятные) варианты:

  1. Поместите форматирование в models.py

  2. Поместите логику / форматирование в views.py

  3. Поместите логику / форматирование в некоторый другой подкласс Person или Address (например, address / html4.py)

  4. Создание пользовательских тегов

Помощь / понимание очень ценится!

Ответы [ 3 ]

13 голосов
/ 29 сентября 2008

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

Базовое определение тега:

@register.inclusion_tag('person/address.html')
def display_address(address):
    return {'address': address}

Использование в шаблонах (при условии, что модуль templatetag, содержащий его, уже {% load %} -ed):

{% display_address address %}
2 голосов
/ 29 сентября 2008

Я бы использовал шаблонный тег для вывода данных с использованием шаблонного html-файла a k a тег включения

1 голос
/ 30 сентября 2008

Думаю, шаблонный фильтр тоже будет полезен. Вы можете передать фильтр для каждого объекта, например:

{{ value|linebreaks }} # standard django filter

Будет производить:

If value is Joel\nis a slug, the output will be <p>Joel<br>is a slug</p>.

См. Встроенные теги и фильтры Django полный справочник.

...