Я придумал следующий метод, который работает для меня, потому что в каждом случае с моделью будет связан ModelForm.
def GetModelData(form, fields):
"""
Extract data from the bound form model instance and return a
dictionary that is easily usable in templates with the actual
field verbose name as the label, e.g.
model_data{"Address line 1": "32 Memory lane",
"Address line 2": "Brainville",
"Phone": "0212378492"}
This way, the template has an ordered list that can be easily
presented in tabular form.
"""
model_data = {}
for field in fields:
model_data[form[field].label] = eval("form.data.%s" % form[field].name)
return model_data
@login_required
def clients_view(request, client_id):
client = Client.objects.get(id=client_id)
form = AddClientForm(client)
fields = ("address1", "address2", "address3", "address4",
"phone", "fax", "mobile", "email")
model_data = GetModelData(form, fields)
template_vars = RequestContext(request,
{
"client": client,
"model_data": model_data
}
)
return render_to_response("clients-view.html", template_vars)
Вот выдержка из шаблона, который я использую для этого конкретного представления:
<table class="client-view">
<tbody>
{% for field, value in model_data.items %}
<tr>
<td class="field-name">{{ field }}</td><td>{{ value }}</td>
</tr>
{% endfor %}
</tbody>
</table>
Приятной особенностью этого метода является то, что я могу выбирать для каждого шаблона порядок, в котором я хотел бы отображать метки полей, используя кортеж, переданный в GetModelData, и указав имена полей. Это также позволяет мне исключить определенные поля (например, внешний ключ пользователя), поскольку в окончательный словарь встроены только имена полей, переданные через кортеж.
Я не собираюсь принимать это как ответ, потому что я уверен, что кто-то может придумать что-то более "Djangonic": -)
Обновление: Я выбрал это в качестве окончательного ответа, потому что он самый простой из тех, которые дают то, что мне нужно. Спасибо всем, кто предоставил ответы.