4

我刚刚从 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 发行说明,注意到有一部分关于非表单数据不再包含在 request.POST 中

HTTP 请求中的非表单数据 request.POST 将不再包含通过 HTTP 请求发布的数据,并且标头中具有非特定于表单的 >content-types。在以前的版本中,使用 >multipart/form-data 或 application/x-www-form-urlencoded 以外的内容类型发布的数据仍将最终在 >request.POST 属性中表示。希望在这些情况下访问原始 POST 数据的开发人员应该使用 request.body 属性。

但是,鉴于我的数据包含<form></form>在模板中的元素中并使用 django 的Form类生成,我不明白为什么数据不在 POST 中?我应该如何提取我的表单数据?

4

1 回答 1

0

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

于 2014-02-11T13:25:27.443 回答