2017-06-11 15 views
-2

Djangoを理解しようとしています...私は、テンプレートにDjangoモデルの大部分のデータであるテーブルを作成したいと考えています。私の好みはモデルのクエリセットPersonDynamic.objects.all()をテンプレートに送り、列名を見つけて各行にループし、その行のフィールドを追加することです。このようなアプローチでは、モデルが変更された場合にテンプレートが自動的に変更されるため、多くの柔軟性が得られます。DjangoテンプレートにDjangoモデルを表示するにはどうすればいいですか?

列ヘッダーと各レコードをリストに移動してテンプレートに送信する方法がありますが、これはクエリセットを送信するだけでは効率が悪いようです。

  • これを行うにはどのような方法が最適ですか?
  • 私は効率について正しいですか?
  • モデルのインスタンスではなくリストを送信すると、アプローチに関係なく、膨大なレコードがある場合、またはそのリスクが存在する場合、問題のリスクが高くなりますか?

ありがとう!

+0

なぜdownvotes? – Ben

答えて

1

django.contrib.adminのコードと組み込みの管理サイトでテーブルを作成する方法を確認してください。管理サイトでは、フィールドの表示方法と表示するフィールドを変更するための追加機能が多数追加されていますが、どのように動作するかを理解する必要があります。

あなたが使いたいと思う最も簡単な方法は、テンプレートに使用するヘッダのリストと、values_listメソッドで呼び出されるクエリセットを送信することです。 values_listは、一連のフィールド名を取り、モデルオブジェクトの代わりにフィールド値のタプルを生成する別のクエリセットを返します。たとえば、あなたのPersonDynamicルックスは次のように言う:

class PersonDynamic(Model): 
    id = AutoField() 
    name = CharField() 
    likes_python = BooleanField() 

次に、あなたのテンプレートにこのような何かを送ることができます:

fields = ['id', 'name', 'likes_python'] 
qs = PersonDynamic.objects.values_list(*fields) 
context = Context({'headers': fields, 'rows': qs}) 
template.render(context) 

そして、あなたのテンプレートが行うことができます:

<table> 
<tr>{% for item in header %}<th>{{ item }}</th>{% endfor %}</tr> 
{% for row in rows %} 
<tr>{% for cell in row %}<td>{{ cell }}</td>{% endfor %}</tr> 
{% endfor %} 
</table> 

をするためにあなたのこれは大きなテーブルでは問題になります。このような大きなリストをループするには時間とメモリが必要です。ページごとにX項目だけが表示されるページネーションのような戦略が一般的に使用されます。

関連する問題