В свете выпуска Django 1.8 (и формализации API Model _meta , я подумал, что обновлю это более поздним ответом.
Предполагая, что та же модель:
class Client(Model):
name = CharField(max_length=150)
email = EmailField(max_length=100, verbose_name="E-mail")
Джанго <= 1,7 </h2>
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:
Модель API _meta
всегда существовала как внутренняя часть 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>