Django SQL循环菜单&子菜单

时间:2014-03-15 01:03:01

标签: python sql django django-models django-templates

尝试创建一个带有“城市/位置”的菜单,其中包含“社区”的子菜单

  • 纽约
  • - 邻里
  • - 邻里
  • - 邻里
  • 芝加哥
  • - 邻里
  • - 邻里
  • - 邻里
  • 迈阿密
  • - 邻里
  • - 邻里
  • - 邻里

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 :(得分: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)

然后,您可以将页面设置为接受城市名称作为href中的参数,然后仅为该城市中的邻居调用页面视图。模板中的href链接转到仅包含邻域的城市视图可能如下所示:

<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中的请求路由视图。如果您还需要其他任何东西,请登录。