升级到django 1.5.1后无法绑定表单数据

时间:2013-04-02 08:45:17

标签: django django-1.5

我刚刚从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中?我该如何提取表单数据?

1 个答案:

答案 0 :(得分:0)

您似乎需要将application / x-www-form-urlencoded或multipart / form-data作为enctype属性添加到表单标记中。