我剛剛從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?我應該如何提取我的表單數據?
您是否嘗試過引用的發行說明的最後一行? – Ngenator
是的,request.body也是空的。另外,文檔中提到「Request.POST中的非表單數據」,但輸入數據顯然是一種表單數據,所以不應該排除在第一位,對嗎? –
試試email = form.cleaned_data.get('email')和password = form.cleaned_data.get('password') – nnmware