我想用Django编写通用视图,在这个函数中我想处理几种情况:首先当我有像vkusers3 / 11122233 / 1/2 /这样的url时我还希望它工作时缺少2或3个参数网址,如:vkusers3 / 11122233 /或vkusers3 / 11122233/1 /
我找不到教程如何做到(https://docs.djangoproject.com/en/1.6/topics/http/urls/等)。 当你在url参数中有超过5个组合时,这成为一场噩梦的问题,那么你应该编写5个不同的url配置,5次在html模板中硬编码这种模式。
但是等等,甚至更多!,组合学怎么样:我想要/用户/团体/性别/吸烟/但我也想要/用户/团体/吸烟/即所有吸烟的男性和女性用户。所以数字很大。
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,MongoDB 2.7.1,mongoengine
答案 0 :(得分:4)
此时,您应该咬紧牙关,只需查询参数 - vkusers3/?sex=1&smoking=2&group= 11122233
。您可以完全从URL和视图定义中删除参数,只需在视图正文中使用request.GET['sex']
等。
答案 1 :(得分:1)
你不需要如此多毛的逻辑。只需使用传递给视图的参数填充搜索critera,如下所示:
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)
是的,请考虑切换到常规的GET参数,如@ daniel-roseman建议的那样。使用您问题中的网址,您无法确定/user/group/sex/
中的/user/group/smoking/
网址。
更新:request.GET
是一个类似dict的对象,因此您可以使用in
表达式:
if 'sex' in request.GET:
criteria['sex'] = int(request.GET['sex'])