【发布时间】:2013-03-23 11:42:19
【问题描述】:
我刚从 django 1.4.5 升级到 django 1.5.1,发现我所有的表单处理代码都停止工作了。具体来说,用 POST 返回的表单数据已经找不到了。
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 的输出 -
Django version 1.4.5, using settings 'myproj.settings'
post: [(u'csrfmiddlewaretoken', u'DnRTYpV1EF9XMQRAKoc3u37wya0TS3mX'), (u'password', u'abcde'), (u'email', u'john@doe.com')]
data: {'password': u'abcde', 'email': u'john@doe.com'}
Django 1.5.1 的输出 -
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 请求发布的数据,且标头中包含非特定于表单的 >content-types。在以前的版本中,使用除 >multipart/form-data 或 application/x-www-form-urlencoded 以外的内容类型发布的数据最终仍会在 >request.POST 属性中表示。希望在这些情况下访问原始 POST 数据的开发人员,>应该改用 request.body 属性。
但是,鉴于我的数据包含在模板中的 <form></form> 元素中并使用 django 的 Form 类生成,我不明白为什么数据不在 POST 中?我应该如何提取我的表单数据?
【问题讨论】:
-
您是否尝试过引用的发行说明的最后一行?
-
是的,request.body 也是空的。此外,文档说“request.POST 中的非表单数据”,但输入数据显然是表单数据,所以不应该首先排除它,对吧?
-
试试 email = form.cleaned_data.get('email') 和 password = form.cleaned_data.get('password')
标签: django django-1.5