在Django中,放置HTML格式数据的简短摘要的最佳位置是哪里?

时间:2020-03-06 14:51:10  来源:igfitidea点击:

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

Django是否有HTML帮助器?

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

我有两个班级,"人"和"地址"。每个人都有多个地址,设置方式也是如此(在各自的模型中。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 }}

我会重复此代码很多次,通常会有一些细微的变化,例如在表中时,然后必须用</ td> <td>替换<br>。其他时候,我不想显示street_2(或者之后的<br>)。可以说,我有一个基本的逻辑要表达,那就是我更不愿意用块复制的方式来搬运!

我想要的是一个person / 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似乎具有以下(可行的)选项:

  • 将格式放在models.py中
  • 将逻辑/格式放入views.py
  • 将逻辑/格式放在Person或者Address的其他子类中(即addresss / html4.py)
  • 创建自定义标签

帮助/见解非常感谢!

解决方案

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

听起来像是我们要寻找的包含标签。我们可以为每个主要版本都有一个模板和标签,并根据需要使用标签的参数为每个模板自定义上下文。

基本标签定义:

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

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

{% display_address address %}

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

{{ value|linebreaks }} # standard django filter

将产生:

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

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