在Django中,放置HTML格式数据的最佳位置在哪里?

9 投票
3 回答
706 浏览
提问于 2025-04-11 09:21

这个问题和以下内容有关(但可能不完全相同):

Django 有 HTML 辅助工具吗?

我的问题是这样的:在 Django 中,我总是需要重复处理一些基础的数据库对象格式。举个例子:

我有两个类,分别是 Person(人)和 Address(地址)。每个 Person 可能有多个 Address,设置如下(在各自的 models.py 文件中):

class Person(models.Model):
  ...

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

现在,每当我查看一个 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. 创建自定义标签

非常感谢任何帮助或见解!

3 个回答

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 内置模板标签和过滤器 的完整参考资料。

2

我会使用一个模板标签,通过一个模板的HTML文件来输出数据,这种标签也叫做包含标签

13

听起来你需要的是一个包含标签。你可以为每个主要的变化创建一个模板和标签,并通过标签的参数来定制每个模板所需的上下文。

基本的标签定义:

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

在模板中使用(假设已经通过{% load %}加载了包含它的templatetag模块):

{% display_address address %}

撰写回答