Django 向ListView中的每个对象添加自定义字段

Django 向ListView中的每个对象添加自定义字段,django,django-views,django-class-based-views,Django,Django Views,Django Class Based Views,我试图在ListView中添加一个自定义字段,以便更详细地描述一个实体(这样我就可以在模板中使用它),但令人惊讶的是,我找不到一种直接的方法来实现这一点。如何向列表中的每个对象添加上下文? self.object\u list返回整个列表,在其中迭代添加这个额外字段会让人感觉不太直观 下面是代码的简化版本: class AreaWiseSchoolsView(ListView): template_name = 'search/area.html' paginate_by =

我试图在ListView中添加一个自定义字段,以便更详细地描述一个实体(这样我就可以在模板中使用它),但令人惊讶的是,我找不到一种直接的方法来实现这一点。如何向列表中的每个对象添加上下文?
self.object\u list
返回整个列表,在其中迭代添加这个额外字段会让人感觉不太直观

下面是代码的简化版本:

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()?

您可以在
学校
模型中添加:

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 %}
现在无需在
列表视图中实现
get\u context\u data()

您可以在
学校
模型中添加:

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 %}

现在无需在
列表视图中实现
get\u context\u data()

是否可以将属性添加到学校模型中:

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 ''

能否将属性添加到学校模型中:

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 ''

这类事情最好作为学校模型本身的一种方法来做。这类事情最好作为学校模型本身的一种方法来做。谢谢@wencakisa的提示。即使我没有在模型中使用
@property
decorator(可能是因为该方法没有参数),它也能在模板中工作。谢谢@wencakisa的提示。即使我没有在模型中使用
@property
装饰器,它也能在模板中工作(可能是因为该方法没有参数)