使用任意数量的 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

UPDATErequest.GET 是一个类似字典的对象,因此您可以使用 in 表达式:

if 'sex' in request.GET:
    criteria['sex'] = int(request.GET['sex'])