Djangoを使用してデータベースのテーブルを表示する必要があります。明らかな方法は、テーブルの見出しを手動で入力し、のクエリ結果をループすることですmodel.objects.all()
。ただし、非常に怠惰なので、これを自動的に実行します。つまり、モデルからイントロスペクションまでのすべてのフィールドをロードして列見出しとして表示し、すべてのフィールド値をロードして行として表示します。このアプローチでは、モデルが変更されたときにテンプレートコードを更新する必要がないため、後で時間を節約することもできます。私はそれを動作させましたが、2つの問題があります:
- AutoFieldフィールド(id)値をロードする場所が見つからないため、ID列を切り取る必要があります。
- 特にランダムなテンプレートタグを使用すると、コードがかなり乱雑に見えます。
これが私のコードです。コードは正常に機能するため、正しいのですべてのインポートをスキップすることに注意してください。
views.py私はシリアライザーを使用してデータをシリアル化します。これはstackoverflowのどこかで読んだトリックです。
def index(request):
fields = MyModel._meta.fields
data = serializers.serialize("python", MyModel.objects.all())
context_instance = RequestContext(request, {
'data' : data,
'fields' : fields,
})
return TemplateResponse(request, 'index.html', context_instance)
template / index.html:フィールドリストの最初の要素を切り取ってID列を切り取る必要があることに注意してください
{% with fields|slice:"1:" as cached_fields %}
<table>
<thead>
<tr>
{% for field in cached_fields %}
<th>{% get_verbose_name field %}</th>
{% endfor %}
</tr>
</thead>
<tbody>
{% for instance in data %}
<tr>
{% for field in cached_fields %}
<td>{% get_value_from_key instance.fields field %}</td>
{% endfor %}
</tr>
{% endfor %}
</tbody>
</table>
{% endwith %}
templatetags / extra_tags.py
# tag to get field's verbose name in template
@register.simple_tag
def get_verbose_name(object):
return object.verbose_name
# tag to get the value of a field by name in template
@register.simple_tag
def get_value_from_key(object, key):
# is it necessary to check isinstance(object, dict) here?
return object[key.name]