筛选每个城市的培训机构
在前端界面上按照城市的id来显示城市的信息。
123 |
{% for city in all_cities %} <a href="?city={{ city.id }}"><span class="">{{ city.name }}</span></a>{% endfor %} |
在views(视图函数)中我们根据条件进一步筛选。
这里有一个小常识。比如我们在在定义培训机构的model的时候,有一个外键,我们虽然传入的字段名称是city,但是在数据库中实际存储的字段名称是city_id, 这样就给我们使用数据带来极大的方便。
12345 |
# 取出筛选的城市city_id = request.GET.get('city', '')if city_id: all_orgs = all_orgs.filter(city_id) |
这里刚刚出现了报错,说参数错误:
12345678910111213141516171819202122 |
Request Method: GETRequest URL: http://localhost:8000/org_list/?city=1Django Version: 1.9Exception Type: ValueErrorException Value: not enough values to unpack (expected 2, got 1)Exception Location: /home/peter/mymooc/mymoocvenv/lib/python3.5/site-packages/django/db/models/sql/query.py in build_filter, line 1146Python Executable: /home/peter/mymooc/mymoocvenv/bin/pythonPython Version: 3.5.2Python Path: ['/home/peter/mymooc/apps', '/home/peter/mymooc', '/root/.venvburrito/lib/python2.7/site-packages', '/root/.venvburrito/lib/python2.7/site-packages/setuptools-28.8.0-py2.7.egg', '/root/.venvburrito/lib/python2.7/site-packages/pip-9.0.1-py2.7.egg', '/home/peter/mymooc/mymoocvenv/lib/python35.zip', '/home/peter/mymooc/mymoocvenv/lib/python3.5', '/home/peter/mymooc/mymoocvenv/lib/python3.5/plat-x86_64-linux-gnu', '/home/peter/mymooc/mymoocvenv/lib/python3.5/lib-dynload', '/usr/lib/python3.5', '/usr/lib/python3.5/plat-x86_64-linux-gnu', '/home/peter/mymooc/mymoocvenv/lib/python3.5/site-packages'] |
修改如下:
12 |
if city_id: all_orgs = all_orgs.filter(city_id=int(city_id)) |
ok,因为city_id在数据库中也是以整形数的形式存储的,也就是int类型的。而从前端页面传过来的的city_id是字符串类型的,所以需要强制转换成整形数,才能正确的找到要筛选的数据。
附上filter的源码:
123456 |
def filter(self, *args, **kwargs): """ Returns a new QuerySet instance with the args ANDed to the existing set. """ return self._filter_or_exclude(False, *args, **kwargs) |
我们继续做选中状态的处理,如果当前的city的id和后端传过来的city的ID一样,那么就把当前的city设置成选中的状态。
这里总结的点就是每一个链接都要有一个合理的值,这个值可以是后台传过来的东西。
1234567891011 |
<h2>机构类别</h2> <div class="cont"> <a href="?city={{ city.id }}"><span class="{% ifequal category '' %}active2{% endifequal %}">全部</span></a> |