2013-06-27 35 views
2

我想使用Django的內置登錄視圖:django.contrib.auth.views.login內置視圖登錄:錯誤處理和好的做法

這種觀點做了偉大的工作。它會檢測登錄是否錯誤以及帳戶何時尚未驗證,但錯誤消息非常短。

對於未激活帳戶:

此帳戶處於非活動狀態。

您是否知道更詳細的正確方法?

我更喜歡這樣的:

此帳戶已停用。一封電子郵件通過激活鏈接發送給您。

其實,我自己做的登錄名和我傳遞給模板的錯誤上下文:

context = {} 
    if request.method == 'POST': 
    email = request.POST['email'] 
    password = request.POST['password'] 

    user = authenticate(username=email, password=password) 
    if user is not None: 
     if user.is_active: 
     login_django(request, user) 
     return redirect('consumer.views.dashboard') 
     else: 
     context = {'error': 'disable_account'} 
    else: 
     context = {'error': 'invalid_account'} 
    return render(request, 'login.html', context) 

,並在模板中,我可以檢查什麼樣的錯誤,就是它了。

回答

1

您報告的行爲實際上不是由於django.contrib.auth.views.login,而是由於它使用的表單。

django.contrib.auth.forms.AuthenticationForm

error_messages = { 
    'invalid_login': _("Please enter a correct %(username)s and password. " 
         "Note that both fields may be case-sensitive."), 
    'inactive': _("This account is inactive."), 
} 

我認爲你有兩個選擇:

  1. 你繼承的形式django.contrib.auth.forms.AuthenticationForm,改變error_messages,並通過新的形式登錄視圖爲authentication_form參數。

  2. 如果您使用translation,則可以翻譯字符串「此帳戶處於非活動狀態」。到你想要的字符串。

在我看來,第一個選擇是最好的做法,因爲翻譯不應該用來改變消息的內容。

+0

表單解決方案很好,但我們可以做得更好嗎?這是一個很長的信息,我認爲它的位置在模板中,不是嗎?謝謝 –

+0

嗯,我認爲消息的大小不應該決定它應該屬於代碼還是模板。這更多的是[封裝](http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)):在這種情況下,form.clean測試用戶是否活躍,因此,將消息在窗體上。 –