2013-04-02 41 views
4

我剛剛從django 1.4.5升級到django 1.5.1,並注意到我的所有表單處理代碼都停止工作。具體來說,使用POST返回的表單數據不會再被找到。升級到django後無法綁定表單數據1.5.1

Django的代碼 -

這裏我遵循的Django 1.5的文檔中的說明和傳遞的request.POST對象,它已經由用戶提交後實例化LoginUserForm

class UserLoginForm(forms.Form): 
    email = forms.EmailField(widget=forms.TextInput(attrs={'placeholder': 'Enter email', 
                 'class': 'span4'})) 
    password = forms.CharField(widget=forms.PasswordInput(attrs={'class': 'span4'})) 


def login_user(self,request): 
    user = None 
    if request.method == 'POST': 
     print "post:", request.POST.items() 
     form = UserLoginForm(request.POST) 
     if form.is_valid(): 
      data = form.cleaned_data 
      email = data['email'] 
      password = data['password'] 
      if email and password: 
       user_service = UserService() 
       email = email.lower() 
       password = string_utils.hash_password(password) 
       user = user_service.get_by_email_and_password(password  = password, 
                   email   = email) 
    return user 

我的表單模板

<form class="well" action="/web/user/login_user?next={{ next_url }}" method="post"> 
{% csrf_token %} 
    <label><strong>Email:</strong></label> 
     {{ form.email }} 
    <label><strong>Password:</strong></label> 
     {{ form.password }} 
    <br />   
     <div class="row"> 
      <div class="span4" style="text-align: right;"> 
      <button type="submit" class="btn">Login</button> 
      </div> 
     </div> 
     <div class="row"> 
      <div class="span2"> 
      <a href="/web/forgot_password" class="gray-underline" style="line-height: 25px; font-size: 12px; ">Forgot Password?</a> 
      </div> 
      <div class="span2" style="text-align: right;">     
      </div> 
     </div>   
</form> 

Django.1.4.5的輸出 -

01 Django的1.5.

輸出 -

Django version 1.5.1, using settings 'myproj.settings' 
post: [] 

我看着Django的1.5.1版本說明,發現有一個關於non-form data not being included in request.POST anymore一部分。

在HTTP非形式的數據請求 request.POST將不再包括經由與非特定形式->內容類型在報頭的HTTP請求發佈數據。在之前的版本中,使用除multipart/form-data或application/x-www-form-urlencoded以外的其他內容類型發佈的數據仍然會以> request.POST屬性表示。希望訪問這些情況下的原始POST數據的開發人員應改用request.body屬性。

然而,鑑於我的數據包在我的模板<form></form>元素,並使用Django的Form類產生的,我不明白爲什麼數據是不是在POST?我應該如何提取我的表單數據?

+1

您是否嘗試過引用的發行說明的最後一行? – Ngenator

+0

是的,request.body也是空的。另外,文檔中提到「Request.POST中的非表單數據」,但輸入數據顯然是一種表單數據,所以不應該排除在第一位,對嗎? –

+0

試試email = form.cleaned_data.get('email')和password = form.cleaned_data.get('password') – nnmware

回答

0

看來您需要將application/x-www-form-urlencoded或multipart/form-data作爲enctype屬性添加到您的表單標記。