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

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() } )

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

我正在重复这段代码,通常会有很小的变化,例如当它在表格中时,然后<!> lt; br <!> gt;必须用<!>替换; / td <!> gt; <!> lt; td <!> gt;。其他时候,我不希望street_2显示(或<!> lt; br <!> gt;之后)。总而言之,我想表达的基本逻辑是,我更不愿意用块和副本来兜售!

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

  4. 创建自定义标记

  5. 非常感谢帮助/见解!

有帮助吗?

解决方案

听起来像包含标签是你在找什么。您可以为每个主要变体创建一个模板和标记,并使用标记的参数根据需要自定义每个模板的上下文。

基本标签定义:

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

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

{% display_address address %}

其他提示

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

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

{{ value|linebreaks }} # standard django filter

将产生:

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top