2017-09-07 8 views
0

エンティティを説明するために、ListViewにカスタムフィールドを追加しようとしています(テンプレート内で使用できるように)。しかし、意外にも、それをする。 に各コンテキストのオブジェクトを追加するにはどうすればよいですか? self.object_listは、リスト全体を返します。これは反復的に直感的に反復され、この余分なフィールドを追加します。ここでListView内の各オブジェクトにカスタムフィールドを追加する

は、コードの簡易版です:テンプレートで

class AreaWiseSchoolsView(ListView): 

    template_name = 'search/area.html' 
    paginate_by = 15 

    def get_queryset(self): 
     qs = School.objects.filter(area__name=self.kwargs['areaname']) 
     return qs 

    def get_context_data(self, **kwargs): 
     school_type_description = "" 
     context = super(AreaWiseSchoolsView, self).get_context_data(**kwargs) 
     # need code here to add the custom field to each object in the list 
     # school = self.something 
     # if school.area.filter(pk=9).exists(): 
     # school_type_description = "Some description for Area 9" 
     # elif school.school_type == 'ND': 
     # school_type_description = "Some description for ND" 
     # elif school.school_type == 'MA': 
     #  org_type_description = "Some description for MA" 
     context['school_type_description'] = school_type_description 
     return context 

、私は次のことを行うことができる必要があります。

{% for school in object_list %} 
    {{school.school_type_description}} 
{% endfor %} 

また、上記を行うための簡単な方法がありますget_context_data()をオーバーライドする代わりに?

+1

この種のものは最高の学校のモデル自体の方法として行われることになります。 –

答えて

2

あなたのSchoolモデルで@propertyを追加することができます。

from django.db import models 


class School(models.Model): 
    # ... 

    @property 
    def type_description(self): 
     school_type_description = 'Some default description' 

     if self.area.filter(pk=9).exists(): 
      school_type_description = "Some description for Area 9" 
     elif self.school_type == 'ND': 
      school_type_description = "Some description for ND" 
     elif self.school_type == 'MA': 
      school_type_description = "Some description for MA" 

     return school_type_description 

そしてあなたが直接あなたのテンプレートでこのプロパティにアクセスすることができます

{% for school in object_list %} 
    {{ school.type_description }} 
{% endfor %} 

あなたListViewget_context_data()を実装する必要はありません今。

+1

チップ@wencakisaをありがとう。モデルで '@ property'デコレータを使用しなくても(おそらくメソッドに引数がないので)、テンプレートで動作しました。 – Anupam

0

あなたがあなたの学校のモデルにプロパティを追加することができます。

class School(models.Model): 
    # YOU DESCRIPTION HERE 

    @property 
    def school_type_description(self): 
     if self.area.filter(pk=9).exists(): 
      return "Some description for Area 9" 
     elif self.school_type == 'ND': 
      return "Some description for ND" 
     elif self.school_type == 'MA': 
      return "Some description for MA" 
     return '' 
関連する問題