Django 1.8のリリース(およびModel _meta APIの正式化)に照らして、これをより最近の回答で更新すると思いました。
同じモデルを想定:
class Client(Model):
name = CharField(max_length=150)
email = EmailField(max_length=100, verbose_name="E-mail")
Django <= 1.7
fields = [(f.verbose_name, f.name) for f in Client._meta.fields]
>>> fields
[(u'ID', u'id'), (u'name', u'name'), (u'E-mail', u'email')]
Django 1.8+(正式なモデル_meta API)
Django 1.8で変更:
Model _meta
APIは常にDjango内部として存在していましたが、正式には文書化されておらず、サポートされていませんでした。このAPIを公開する取り組みの一環として、既存のAPIエントリポイントの一部がわずかに変更されました。新しい公式APIを使用するようにコードを変換するのに役立つ移行ガイドが提供されています。
以下の例では、我々はのための正式な方法を利用するモデルのすべてのフィールドインスタンスの取得を経由しClient._meta.get_fields()
:
fields = [(f.verbose_name, f.name) for f in Client._meta.get_fields()]
>>> fields
[(u'ID', u'id'), (u'name', u'name'), (u'E-mail', u'email')]
実は、上記は必要なものに対しては少し行き過ぎであることに私の注意が向けられました(同意します!)。シンプルは複雑よりも優れています。参考までに残しておきます。ただし、テンプレートに表示するには、ModelFormを使用してインスタンスを渡すのが最善の方法です。フォームを反復処理し(フォームの各フィールドを反復処理することと同じ)、label属性を使用してモデルフィールドのverbose_nameを取得し、valueメソッドを使用して値を取得できます。
from django.forms import ModelForm
from django.shortcuts import get_object_or_404, render
from .models import Client
def my_view(request, pk):
instance = get_object_or_404(Client, pk=pk)
class ClientForm(ModelForm):
class Meta:
model = Client
fields = ('name', 'email')
form = ClientForm(instance=instance)
return render(
request,
template_name='template.html',
{'form': form}
)
次に、テンプレート内のフィールドをレンダリングします。
<table>
<thead>
{% for field in form %}
<th>{{ field.label }}</th>
{% endfor %}
</thead>
<tbody>
<tr>
{% for field in form %}
<td>{{ field.value|default_if_none:'' }}</td>
{% endfor %}
</tr>
</tbody>
</table>