【问题标题】:Unable to bound form data after upgrading to django 1.5.1升级到 django 1.5.1 后无法绑定表单数据
【发布时间】: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 属性。

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

【问题讨论】:

  • 您是否尝试过引用的发行说明的最后一行?
  • 是的,request.body 也是空的。此外,文档说“request.POST 中的非表单数据”,但输入数据显然是表单数据,所以不应该首先排除它,对吧?
  • 试试 email = form.cleaned_data.get('email') 和 password = form.cleaned_data.get('password')

标签: django django-1.5


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-23
    • 2016-09-07
    • 2014-08-15
    • 2015-12-10
    • 1970-01-01
    • 2017-01-10
    • 2020-01-06
    • 2019-05-08
    相关资源
    最近更新 更多