9

この質問は次のものに関連しています (ただし、まったく同じではない可能性があります):

Django には HTML ヘルパーがありますか?

私の問題は次のとおりです。Django では、低レベルのデータベース オブジェクトの基本的な書式設定を常に再現しています。次に例を示します。

Person と Address の 2 つのクラスがあります。Person ごとに複数の Addresses があり、同じように設定します (それぞれのmodels.py内) 。

class Person(models.Model):
  ...

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

今、Person を見るときはいつでも、すべての Address を見たいと思っています。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 }}

私はこのコードを何度も繰り返していますが、多くの場合、テーブルにある場合など、マイナーなバリエーションがあり、< br > を < /td >< td > に置き換える必要があります。また、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には次の(もっともらしい)オプションがあるようです:

  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ファイル別名包含タグを使用してデータを出力するテンプレートタグを使用します

于 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 に答える