2015-10-16 83 views
2

說,在我的註冊類的post方法中,如果用戶已經註冊,我想將用戶重定向到登錄頁面,足夠簡單。Django反向使用kwargs

class Register(View): 
    ... 
    def post(self, request): 
     # Some code to check if the email address is already in the db 
     message = {'message': 'You are already a member and registered the project. Please just log-in', 
        'registration_date': the_registered_date}# The form with the filled-in data is returned 
     return HttpResponseRedirect(reverse('accounts:login', kwargs = message)) 

在我的urls.py:

#urls.py 
... 
url(r'^login/{0,1}$', Login.as_view(), name='login', kwargs={'message': None, 'date': None}), 

這給我的錯誤信息:

Reverse for 'login' with arguments '()' and keyword arguments '{'message': 'You are already a member and registered the project. Please just log-in', 'registration_date': datetime.datetime(2015, 10, 15, 14, 3, 39, 864000, tzinfo=<UTC>)}' not found. 2 pattern(s) tried: [u'accounts/$', u'accounts/login/{0,1}$'] 

我在做什麼錯?

+0

這看起來不對:'^ login/{0,1} $' – Wtower

回答

1

reverse中的Kwargs是進入您的URL以使其唯一的變量。在URL中看到消息/日期真是很奇怪......這正是你的URLconf想要做的。

此外,您不能在Django中使用上下文重定向,而不會導致汁液不值得擠壓。如果您想在重定向後執行此操作,則一種方法是使用messages framework在登錄頁面上顯示消息。

我的解決方案是從您的URLConf中爲/ login /移除kwargs,並使用消息框架(或sessions)在重定向後將信息傳遞到登錄頁面。

5

你的網址定義是錯誤的,這聽起來像是你的錯誤理解kwargsreverse中所做的。它將您的url定義的命名參數與它的值一起提供,而不是將上下文傳遞給視圖。

例如,你可以這樣做:

url(r'test_suite/(?P<test_name>\w+)/(?P<test_id>\d+)$', 'test', name='test') 
reverse('test', kwargs={'test_name': 'haha', 'test_id': 1}) 

kwargs將取代您在網址test_name定義與hahatest_id1。這將產生一個url:test_suite/haha/1