Django SQL遍历菜单和子菜单
我想做一个菜单,里面有“城市/地点”,然后每个城市下面还有一个子菜单,列出“社区”。
- 纽约
- -- 社区
- -- 社区
- -- 社区
- 芝加哥
- -- 社区
- -- 社区
- -- 社区
- 迈阿密
- -- 社区
- -- 社区
- -- 社区
View.py
def location(request):
args['getlocs'] = Location.objects.filter(switch=1, restaurants__city_id=8).order_by('name')
args['gethoods'] = Hood.objects.filter(switch=1, restaurants__city_id=8).distinct().order_by('name')
return render_to_response('location.html', args)
Template.html
<ul>
{% for location in getlocs %}
<li>{{ location.name }}</li>
<ul>
{% for hood in gethoods %}
<li>{{ hood.name }}</li>
{% endfor %}
</ul>
{% endfor %}
</ul>
很明显,当我运行这个的时候,数据库里的每个社区都会显示出来,但我只想显示每个城市/地点下的社区。有没有办法在html模板里加个条件,还是说我需要修改视图?非常感谢!
编辑:
class Location(models.Model):
name = models.CharField(max_length=50, db_column='location', blank=False, null=False)
city = models.ForeignKey('City', related_name="locations")
...
class Hood(models.Model):
name = models.CharField(max_length=50, db_column='hood')
city = models.ForeignKey('City', related_name='hoods')
location = models.ForeignKey('Location', related_name='hoods')
...
class Restaurant(models.Model):
name = models.CharField(max_length=50, db_column='name', blank=True)
location = models.ForeignKey('Location', related_name="restaurants")
hood = models.ForeignKey('Hood', null=True, blank=True, related_name="restaurants")
...
1 个回答
0
如果我理解得没错,一个城市有很多社区。所以这是一个多对多的关系。在models.py文件中,这看起来像这样:
from django.db import models
class Neighborhood(models.Model):
name = models.CharField(max_length=100)
class City(models.Model):
name = models.CharField(max_length=100)
neighborhoods = models.ManyToManyField(Neighborhood)
接下来,你可以设置你的页面,让它接受城市名称作为链接中的参数,然后调用一个只显示该城市社区的页面视图。在模板中,指向城市视图的链接,显示该城市的社区,可能像这样:
<a href="{% url 'city_view' city.name %}">Link</a>
这个链接在你的urls.py文件中对应着这个网址:
url(r'city/(?P<city_name>.+)/$', views.city_view, name='city_view')
然后在views.py中,你的视图会过滤出该城市的社区,可能看起来像这样:
def city_view(request, name):
city = City.objects.get(name=name)
neighborhoods = city.neighborhoods.all()
return render(request, 'template.html', {'neighborhoods': neighborhoods})
最后,在template.html中只调用该城市的社区:
{% for neighborhood in neighborhoods %}
neighborhood.name
{% endfor %}
希望这能帮助你理解数据库的调用、views.py的进展,以及它是如何根据urls.py中的请求来路由视图的。如果你需要其他帮助,告诉我哦。