2015-03-02 110 views
0

我想用Django編寫通用視圖,在這個函數中,我想處理幾種情況:首先,當我有像vkusers3/11122233/1/2 /的網址,並且我也想要它在url中缺少2或第三個參數時工作,如:vkusers3/11122233 /或vkusers3/11122233/1/Django的意見與任意數量的url參數

我無法找到它教程如何做到這一點(https://docs.djangoproject.com/en/1.6/topics/http/urls/等)。 這個問題,當你在url參數中有5個以上的組合時,這變成了一場噩夢,那麼你應該寫5個不同的url配置,5次在html模板硬編碼這個模式。

但是等等,甚至更多!關於combinatorics:我想要/用戶/組/性別/吸菸/而且我想要/用戶/組/抽菸/即所有用戶誰是抽菸的男人和女人。所以這個數字是巨大的。

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

回答

4

在這點,你應該咬一口子,然後去查詢參數 - vkusers3/?sex=1&smoking=2&group= 11122233。您可以完全從URL和視圖定義中刪除參數,並在視圖正文中使用request.GET['sex']等。

+0

是,這個作品! thanx,令人驚訝的是我用self.request.GET,但不知道如何獲取參數 – 2015-03-02 16:49:23

1

你不需要這麼毛茸茸的邏輯。只需填充搜索性判據與傳遞到視圖這樣的論點:

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參數,如@丹尼爾 - 羅斯曼建議。如果您的問題存在網址,則無法確定/user/group/smoking//user/group/sex/網址。

UPDATErequest.GET是一個類似字典的對象,所以你可以使用in表達:

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

簡單,如果'人'這是在查詢中構建字典的酷的方法!它的工作原理,但如果我這樣做request.GET ['性別']: 條件['性別'] = int(request.GET ['性別'])它引發錯誤時,未指定第二個參數在url中,例如http://127.0.0.1:8000/post/vkusers2/?group=81099158。錯誤:MultiValueDictKeyError at/post/vkusers2/ – 2015-03-02 16:51:50

+1

查看已更新的答案。 – catavaran 2015-03-02 21:46:05