Django 1.8의 릴리스 (및 Model _meta API 공식화)를 고려 하여 더 최근의 답변으로 이것을 업데이트 할 것이라고 생각했습니다.
동일한 모델을 가정 :
class Client(Model):
name = CharField(max_length=150)
email = EmailField(max_length=100, verbose_name="E-mail")
장고 <= 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)
장고 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>