我刚刚从django 1.4.5升级到django 1.5.1,并注意到我的所有表单处理代码都停止了工作。具体来说,无法再找到POST返回的表单数据。
Django代码 -
这里我按照Django 1.5文档中的说明进行操作,并在用户提交后实例化LoginUserForm后传递request.POST对象
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将不再包含通过标头中具有非特定于表单的&gt;内容类型的HTTP请求发布的数据。在先前版本中,使用除&gt; multipart / form-data或application / x-www-form-urlencoded之外的内容类型发布的数据仍将最终在&gt; request.POST属性中表示。希望访问这些案例的原始POST数据的开发人员,应该使用request.body属性。
但是,鉴于我的数据包含在我的模板中的<form></form>
元素中并使用django的Form
类生成,我无法理解为什么数据不在POST中?我该如何提取表单数据?
答案 0 :(得分:0)
您似乎需要将application / x-www-form-urlencoded或multipart / form-data作为enctype属性添加到表单标记中。