ホーム>source

forループで列の名前を自動的に取得したいと思います。 列の名前がわかっている場合、この方法でテンプレートを作成できます。

<ul>
{% for co in team %}
    <li>{{ co.name }}</li>
    <li>{{ co.team}}</li>
    <li>{{ co.sport}}</li>
{% endfor %}
</ul>

しかし、現在のケースでは、テーブルの列の名前がわかりません。どうすれば表示できますか?

ありがとうございました

あなたの答え
  • 解決した方法 # 1

    次の方法でモデルのフィールドを取得できます。

    fields = Model._meta.get_fields()
    
    

    これはタプルです Field  [GitHub]オブジェクト。これらの Field  オブジェクトには name があります  属性。これにより、次のようにしてフィールド名を取得できます。

    from operator import attrgetter
    field_names = map(attrgetter('name'), Model._meta.get_fields())
    
    

    モデルがわからない場合、 type(..) を使用してモデルインスタンスのモデルへの参照を取得できます。 :

    fields =type(some_instance)._meta.get_fields()
    
    

    ただし、このロジックはすべてDjangoテンプレートに属しているのではなく、ビューに属します(設計上、Djangoテンプレートは書き込みを防ぐために少し制限されていますビジネスの論理 テンプレート内)。したがって、フィールド名のリストをテンプレートに渡すことができます。

    def some_view(request):
        teams = Team.objects.all()
        field_names = [f.name for f in Team._meta.get_fields()]
        return render(request, 'some_template.html',
            {'teams': teams, 'field_names': field_names}
        )
    
    

    ただし、これらのチームの値を印刷したい場合、これはまだ機能しません。任意 テンプレートの属性。その後、処理をビューに再度シフトできます。

    from operator import attregetter
    def some_view(request):
        teams = Team.objects.all()
        field_names = [f.name for f in Team._meta.get_fields()]
        atgetters = [attrgetter(fn) for fn in field_names]
        rows = [[ag(team) for ag in atgetters] for team in teams]
        return render(request, 'some_template.html',
            {'teams': teams, 'field_names': field_names, 'data': data}
        )
    
    

    だからここで data   data[i][j] などのリストを含むリスト   field_name[j] という名前のフィールドの値が含まれます   teams[i] の 。

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ java - Androidには再生、一時停止、巻き戻し、早送りのメソッドがありますか?