2012-04-03 61 views
1

我正在開發一個網站,並且我已經集成了的功能,讓用戶更改他/她的密碼。我正在使用django.contrib.auth中的內置視圖。使用AJAX在Django中更改密碼

現在,我們需要使用AJAX來做到這一點。我的意思是,這個想法是將請求發送到服務器,而不用重新加載整個頁面。如果密碼正確更改,那麼我只需要顯示一條消息,如果沒有,則顯示每個字段有錯誤的表單。

我能做到這一點創建用於此用途的單獨視圖,但我想知道如果有替代?我的意思是,視圖應該很容易,但已經在django.contrib.auth中完成了......

回答

1

絕對可以繼承現有的django.contrib.auth視圖,但我認爲編寫自己的ajax特定視圖是一種更好的方法無論如何它只需要幾行代碼。

下面是它可能看起來是這樣的:

@login_required 
def change_password(request): 

    if request.is_ajax(): 
     try: 
      # extract new_password value from POST/JSON here, then 

      user = User.objects.get(username=request.user.username) 
     except User.DoesNotExist: 
      return HttpResponse("USER_NOT_FOUND") 
     else 
      user.set_password(new_password) 
      user.save() 

     return HttpResponse("OK") 
    else: 
     return HttpResponse(status = 400) 
+0

OP意味着用戶只能更改他/她的密碼。 GET方法在這裏看起來也很糟糕。 – okm 2012-04-03 06:25:24

+0

@okm好的。我還提到'change_password',而不是'reset_password'。 @BluesRockAddict謝謝。實際上,我可以很容易地從'password_change'視圖中複製和粘貼代碼,並修改響應,但我想知道是否有一種方法不涉及複製和粘貼代碼。更好的思考,我真的不認爲有:'(' – 2012-04-03 06:31:31

+0

我的意思是爲什麼你需要在這裏的id,不是request.user足夠嗎?你的代碼允許登錄用戶修改其他密碼,這聽起來很糟糕。另外, HTTP方法有它自己的含義,GET不適用於這樣的任務 – okm 2012-04-03 07:16:38

1

如果我選擇,我會還與落實供您使用單獨的視圖去。

理想情況下,如果django.contrib.auth在基於類的視圖中重新實現,那麼您將能夠重新使用更改密碼的邏輯並僅爲返回更適合AJAX的響應的部分編寫代碼。但太糟糕了,我們並沒有那麼奢侈,至少不是因爲django 1.3或之前的版本。

但是要回答你的問題,是的,有一個替代方案(或者我稱之爲黑客),使您可以重用django.contrib.auth中的視圖。假設您使用的是jQuery,則在提交更改密碼錶單時,您將向服務器發出AJAX POST請求,並期望返回(如下所示)html。返回的html與使用非AJAX POST時獲得的html相同。

var post_url = $form.attr("action"); 
    $.ajax({ 
    type: "POST", 
    url: post_url, 
    data: $form.serialize() 
    }).done(function(html) { 
    // check the html and use that to determine what message to prompt back to your user 
    });