将子项分为子进入父django

时间:2016-04-08 04:50:48

标签: django sorting filter relationship

这主要是有效的(感谢上一个问题的很多帮助。Sort children into parent in django template

现在我想将子子对象排序到子对象中,然后将子对象排序到父对象中。具体来说,我想将学校分为各自的州。然后,我希望学校以正确的状态展示到正确的城市。我想要的是这样的:

国家 ---城市 -----学校 -----学校 -----学校 ---城市 -----学校 -----学校 -----学校 ---城市 -----学校 -----学校 -----学校

现在,我让城市排序进入州。但是,我无法想办法让学校融入这座城市。我正在阅读文档中的过滤器。我认为答案就在那里。但是,当我试图将学校过滤到城市时,没有任何物品回来。

有没有办法检索' school_list'作为city_list'的孩子。同时仍然保持城市名单成为各州的孩子?我很乐意学习如何。

编辑:添加了学校模型。在城市内按名称对学校进行排序是理想的。

任何和所有帮助将不胜感激。

编辑:dkarchmer的解决方案完美无缺。再次感谢。希望这对未来的其他人有用。

models.py

-layoutIfNeeded

views.py

class State(models.Model):
    state_name = models.CharField(max_length=20, default='')
    state_slug = models.SlugField()
    state_image = models.ForeignKey(Image, null=True)
    state_summary = models.TextField(null=True)

    def __str__(self):
        return self.state_slug

class City(models.Model):
    city_name = models.CharField(max_length=55, default='')
    city_slug = models.SlugField()
    state_image = models.ForeignKey(Image, null=True)
    school_image = models.ForeignKey(Image, null=True, related_name='+')
    state = models.ForeignKey(State, null=True)
def __str__(self):
    return self.city_slug

def def sorted_schools(self):
    return self.school_set.all().order_by('school_name')

class School(models.Model):
    school_name = models.CharField(max_length=55, default='')
    school_slug = models.SlugField()
    city = models.ForeignKey(City, null=True)

    def __str__(self):
        return self.school_slug

urls.py

class CityInStateView(ListView):
    model = City
    template = 'template.html'
    slug_field = 'state_slug'

    context_object_name = 'city_in_state_list'

    def get_context_data(self, **kwargs):
        context = super(CityInStateView, self).get_context_data(**kwargs)
        context['state'] = self.object
        context['city_list'] = self.object.city_set.all().order_by('city_name')
        return context

template.html

urlpatterns = [
    url(r'^$', SchoolIndexView.as_view(), name='school_index'),
    url(r'^(?P<state_slug>[\w-]+)/$', CityInStateView.as_view(), name='state_index'),
]

这已经让我的屁股踢了一个星期。请像我一样向我解释一下。我提前感谢您的所有帮助。

1 个答案:

答案 0 :(得分:2)

最简单的方法是向City模型添加一个方法以返回学校:

class City(models.Model):
    ...

    def sorted_schools(self):
        return self.school_set.all().order_by('school_name')

然后直接从模板中使用它:

<div class="row body">
    <div class="main_content">
        <div class="row">
           <h1>{{ state.state_name }}</h1>
           {% for city in city_list %}
              <h2>{{ city.city_name }}</h2>
              {% for school in city.sorted_schools %}
                  <h3>{{ school.school_name }} </h3>
              {% endfor
           {% endfor %}
        </div> 
    </div>
</div>  

如果您不想将该方法添加到模型中,则第二种方法是使用模板标签基本上执行相同操作。