使用任意数量的 url 参数在 Django 中查看
Views in Django with arbitrary number of url parameters
我想用 Django 编写通用视图,在这个函数中我想处理几种情况:首先当我有 url 像 vkusers3/11122233/1/2/ 并且我希望它在 2 或第三时工作url 中缺少参数,例如:vkusers3/11122233/ 或 vkusers3/11122233/1/
我找不到有关如何操作的教程(https://docs.djangoproject.com/en/1.6/topics/http/urls/ 等)。
当你在 url 参数中有 5 个以上的组合时,这变成了一个噩梦的问题,那么你应该编写 5 个不同的 url 配置,在 html 模板中硬编码这个模式 5 次。
但是等等,甚至更多!,组合学呢:我想要 /user/group/sex/smoking/ 但我也想要 /user/group/smoking/ 即所有吸烟的男性和女性用户。所以数量很大。
def list_groupmembers_sex(request, group_id, sex=None, smoking=None):
success = False
if group_id and sex and smoking==None:
vkusers = Vkuser._get_collection().find({"member_of_group": int(group_id), 'sex': int(sex)})# 62740364 81099158
success = True
elif group_id and sex and smoking!=None:
vkusers = Vkuser._get_collection().find({"member_of_group": int(group_id), 'sex': int(sex), 'personal.smoking': int(smoking)})
success = True
else:
vkusers = Vkuser._get_collection().find({'personal.smoking': 1})
ctx = {'vkuser_list': vkusers, 'group_id': group_id, 'sex': sex, 'smoking':smoking, 'success': success}
return render_to_response('blog/vkuser_list.html', ctx, context_instance = RequestContext(request))
在我的 urls.py:
url(r'^vkusers3/(\d{1,8})/(\d{1})/(\d{1})/$', 'blog.views.list_groupmembers_sex', name='vkuser-list3'),
在我的 base.html:
<li class="menu-level-1"><a href="{% url 'vkuser-list3' group_id sex smoking %}">users</a></li>
Django 1.6.10,MongoDB2.7.1,mongoengine
在这一点上,您可能应该硬着头皮去查询参数 - vkusers3/?sex=1&smoking=2&group= 11122233
。您可以完全从 URL 和视图定义中删除参数,只在视图主体中使用 request.GET['sex']
等。
你不需要这么毛茸茸的逻辑。只需使用传递给视图的参数填充搜索条件,如下所示:
criteria = {}
if group_id:
criteria['member_of_group'] = int(group_id)
if sex:
criteria['sex'] = int(sex)
if smoking:
criteria['personal.smoking'] = int(smoking)
vkusers = Vkuser._get_collection().find(criteria)
是的,考虑切换到@daniel-roseman 建议的常规 GET 参数。对于您问题中的 url,您无法从 /user/group/smoking/
.
中确定 /user/group/sex/
url
UPDATE:request.GET
是一个类似字典的对象,因此您可以使用 in
表达式:
if 'sex' in request.GET:
criteria['sex'] = int(request.GET['sex'])
我想用 Django 编写通用视图,在这个函数中我想处理几种情况:首先当我有 url 像 vkusers3/11122233/1/2/ 并且我希望它在 2 或第三时工作url 中缺少参数,例如:vkusers3/11122233/ 或 vkusers3/11122233/1/
我找不到有关如何操作的教程(https://docs.djangoproject.com/en/1.6/topics/http/urls/ 等)。 当你在 url 参数中有 5 个以上的组合时,这变成了一个噩梦的问题,那么你应该编写 5 个不同的 url 配置,在 html 模板中硬编码这个模式 5 次。
但是等等,甚至更多!,组合学呢:我想要 /user/group/sex/smoking/ 但我也想要 /user/group/smoking/ 即所有吸烟的男性和女性用户。所以数量很大。
def list_groupmembers_sex(request, group_id, sex=None, smoking=None):
success = False
if group_id and sex and smoking==None:
vkusers = Vkuser._get_collection().find({"member_of_group": int(group_id), 'sex': int(sex)})# 62740364 81099158
success = True
elif group_id and sex and smoking!=None:
vkusers = Vkuser._get_collection().find({"member_of_group": int(group_id), 'sex': int(sex), 'personal.smoking': int(smoking)})
success = True
else:
vkusers = Vkuser._get_collection().find({'personal.smoking': 1})
ctx = {'vkuser_list': vkusers, 'group_id': group_id, 'sex': sex, 'smoking':smoking, 'success': success}
return render_to_response('blog/vkuser_list.html', ctx, context_instance = RequestContext(request))
在我的 urls.py:
url(r'^vkusers3/(\d{1,8})/(\d{1})/(\d{1})/$', 'blog.views.list_groupmembers_sex', name='vkuser-list3'),
在我的 base.html:
<li class="menu-level-1"><a href="{% url 'vkuser-list3' group_id sex smoking %}">users</a></li>
Django 1.6.10,MongoDB2.7.1,mongoengine
在这一点上,您可能应该硬着头皮去查询参数 - vkusers3/?sex=1&smoking=2&group= 11122233
。您可以完全从 URL 和视图定义中删除参数,只在视图主体中使用 request.GET['sex']
等。
你不需要这么毛茸茸的逻辑。只需使用传递给视图的参数填充搜索条件,如下所示:
criteria = {}
if group_id:
criteria['member_of_group'] = int(group_id)
if sex:
criteria['sex'] = int(sex)
if smoking:
criteria['personal.smoking'] = int(smoking)
vkusers = Vkuser._get_collection().find(criteria)
是的,考虑切换到@daniel-roseman 建议的常规 GET 参数。对于您问题中的 url,您无法从 /user/group/smoking/
.
/user/group/sex/
url
UPDATE:request.GET
是一个类似字典的对象,因此您可以使用 in
表达式:
if 'sex' in request.GET:
criteria['sex'] = int(request.GET['sex'])