这主要是有效的(感谢上一个问题的很多帮助。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'),
]
这已经让我的屁股踢了一个星期。请像我一样向我解释一下。我提前感谢您的所有帮助。
答案 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>
如果您不想将该方法添加到模型中,则第二种方法是使用模板标签基本上执行相同操作。