9

这个问题与(但可能不完全相同)有关:

Django 有 HTML 助手吗?

我的问题是:在 Django 中,我不断地复制低级数据库对象的基本格式。这是一个例子:

我有两个类,Person 和 Address。每个人有多个地址,设置类似(在他们各自的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() } )

而且,我有一个模板,persons/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 }}

我将这段代码重复了很多次,通常有细微的变化,例如当它在一个表中时,然后 <br> 必须由</td><td> 代替。其他时候,我不想显示 street_2(或它之后的 <br>)。总而言之,我想表达一个基本逻辑,即我更不愿意使用块复制!

我想要的是一个persons/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 的其他子类中(即addresses/html4.py)

  4. 创建自定义标签

帮助/洞察力非常感谢!

4

3 回答 3

13

听起来您正在寻找包含标签。您可以为每个主要变体设置一个模板和标签,并根据需要使用标签的参数自定义每个模板的上下文。

基本标签定义:

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

在模板中使用(假设包含它的 templatetag 模块已经被{% load %}-ed):

{% display_address address %}
于 2008-09-28T21:53:27.140 回答
2

我会使用模板标签输出数据,使用模板 html-file aka包含标签

于 2008-09-28T21:52:19.107 回答
1

我认为模板过滤器也会很有用。您可以在每个对象上传递过滤器,例如:

{{ value|linebreaks }} # standard django filter

将产生:

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

请参阅Django 内置模板标签和过滤器完整参考。

于 2008-09-30T13:26:16.297 回答