2010-06-07 20 views
1

URL配置和觀點如下:Django的:如何寫反函數以下

url(r'^register/$', 
    register, 
    { 'backend': 'registration.backends.default.DefaultBackend' }, 
    name='registration_register'), 



def register(request, backend, success_url=None, form_class=None, 
      disallowed_url='registration_disallowed', 
      template_name='registration/registration_form.html', 
      extra_context=None): 

我想要做的是將用戶重定向到註冊頁面並指定success_url。我嘗試了reverse('registration.views.register',kwargs = {'success_url':'/ test /'}),但這似乎不起作用。我一直在努力幾個小時,無法讓我的想法得到正確的答案。謝謝

回答

1

如果您希望能夠使用參數指定reverse(),則必須在URL配置本身(regexp)中定義這些參數。例如:

url(r'^register/(?P<success_url>[\w\/]+)/$', 
    register, 
    { 'backend': 'registration.backends.default.DefaultBackend' }, 
    name='registration_register'), 

您可以將該URL部分包裝在()中?使它可選的(因此,它只是簡單的寄存器匹配/太) ARGSkwargs之間的區別是,使用ARGS可以指定無名/命名網址參數,同時與kwargs唯一命名。 所以:

r'^register/(?P<success_url>\w+)/$' 
reverse('url_name', args=[my_success_url]) 
reverse('url_name', kwargs={'success_url': my_success_url}) // both work and do the same 

r'^register/(\w+)/$' 
reverse('url_name', args=[my_success_url]) // only this works 

編輯: 對於success_url PARAMS,如果你想能夠匹配任何充分相對URL,包括在相對URL可能GET參數,可以在實際的正則表達式可以得到相當複雜。 喜歡的東西(未經測試):

r'^register/(?P<success_url>[\w\/]+(((\?)([a-zA-Z]*=\w*)){1}((&)([a-zA-Z]*=\w*))*)?)/$' 
+0

非常感謝!這個問題的全部原因是因爲我想在註冊後將用戶重定向到他們來自哪裏。猜猜我也可以使用會話參數。我發現我存儲會話數據有時是一種簡單的方法。你會推薦這樣做嗎?再次感謝! – ninja123 2010-06-08 00:28:07

0

編輯:對不起,完全誤讀了這個問題 - 我沒有看看函數的定義。實際上,這裏的問題是你的URLconf被設計成使得不可能動態地設置success_url。它必須通過extra_context字典明確地傳遞給函數 - 即您當前定義的字典backend。由於URL本身沒有任何內容可以接受此參數,因此必須在此處進行硬編碼。

+0

所以 'success_url', 'form_class', 'disallowed_url' 等都是GET參數?所以一般來說,在視圖函數中設置的所有kwargs都是GET參數? – ninja123 2010-06-07 12:12:42

+0

沒有probs,所以你的意思是我不能調用reverse?但直接調用該函數?你能舉個例子嗎?謝謝 – ninja123 2010-06-07 12:57:42

+0

它們不是GET參數,它們只是發送到Python視圖函數的額外參數。從URL配置文件中定義的參數(更確切地說是「捕獲的」)也可以是GET參數,但不一定是。僅當您選擇以如下格式定義URL時:^ register?my_get_param =(?P \ w +) – 2010-06-07 13:38:58