2013-04-02 2 views
4

Я только что обновился с django 1.4.5 до django 1.5.1 и заметил, что весь мой код обработки формы перестает работать. В частности, данные формы, возвращенные с помощью POST, больше не могут быть найдены.Невозможно связать данные формы после обновления до django 1.5.1

Джанго код -

здесь я следую инструкциям из документации 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'[email protected]')] 
data: {'password': u'abcde', 'email': u'[email protected]'} 

Выход Джанго 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.

Non-формы данных в HTTP запросы request.POST больше не будет включать в себя данные, отправленные с помощью HTTP-запросов с не образуют специфические> типов содержимого в заголовке. В предыдущих версиях данные, размещенные с типами контента, отличными от> multipart/form-data или application/x-www-form-urlencoded, по-прежнему будут представлены в атрибуте request.POST. Разработчики, желающие получить доступ к необработанным данным POST для этих случаев, должны использовать атрибут request.body.

Однако, учитывая мои данные, завернутые в <form></form> элементах в шаблоне и генерируются с использованием Form класса Джанго, я не могу понять, почему данные не в POST? Как извлечь данные формы?

+1

Вы пробовали последнюю строку заметок, которые вы цитировали? – Ngenator

+0

Да, request.body также был пуст. Кроме того, в документации указано «Неформальные данные в запросе.POST», но входные данные явно являются данными формы, поэтому его не следует исключать в первую очередь, верно? –

+0

Попробуйте отправить email = form.cleaned_data.get ('email') и пароль = form.cleaned_data.get ('password') – nnmware

ответ

0

Кажется, вам нужно добавить в свой тег формы приложение/x-www-form-urlencoded или multipart/form-data в качестве атрибута enctype.