2010-08-20 84 views
2

這讓我很想做出這個簡單的表單。幾乎沒有,但是當我提出我得到NoneType錯誤Django錯誤:'NoneType'對象不是可以訂購的

views.py:

from djangoproject1.authentication import forms 
from django.contrib.auth.models import User 
from django.http import HttpResponseRedirect 
from django.shortcuts import render_to_response 

def main(request): 
    rf = forms.RegisterForm() 
    pf = forms.ProfileForm() 
    return render_to_response("authentication/index.html", {'form1': rf, 'form2':pf}) 

def register(request): 
    if request.method == 'POST': 
     rf = forms.RegisterForm(request.POST) 
     pf = forms.ProfileForm(request.POST) 
     if rf.is_valid() and pf.is_valid(): 
      newuser = User(username=rf.cleaned_data['username'],email=rf.cleaned_data['email']) # this is the offending line 
      newuser.set_password(rf.cleaned_data['password']) 
      newuser.save() 
      profile = pf.save(commit=False) 
      profile.user = newuser 
      profile.save() 
      return HttpResponseRedirect("/register-success/") 
    else: 
     return main(request) 

forms.py:

from django import forms 
from djangoproject1.authentication.models import UserProfile  

class RegisterForm(forms.Form): 
    username = forms.CharField(min_length=6,max_length=15) 
    password = forms.CharField(min_length=6,max_length=15,widget = forms.PasswordInput()) 
    cpassword = forms.CharField(label='Confirm Password',widget = forms.PasswordInput()) 
    email = forms.EmailField(label='E-mail Address') 

    def clean(self): 
     if self.cleaned_data['cpassword']!=self.cleaned_data['password']: 
      raise forms.ValidationError("Passwords don't match") 

class ProfileForm(forms.ModelForm): 
    phonenumber = forms.CharField(label='Phone Number') 

    class Meta: 
     model = UserProfile 
     exclude = ('user') 

堆棧跟蹤:

Environment: 

Request Method: POST 
Request URL: http://localhost:8000/register/ 
Django Version: 1.2.1 
Python Version: 2.7.0 
Installed Applications: 
['django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'djangoproject1.authentication'] 
Installed Middleware: 
('django.middleware.common.CommonMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware') 


Traceback: 
File "C:\Python27\lib\site-packages\django\core\handlers\base.py" in get_response 
    100.      response = callback(request, *callback_args, **callback_kwargs) 
File "C:\Users\jec23\My Java Projects\djangoproject1\src\djangoproject1\..\djangoproject1\authentication\views.py" in register 
    21.    newuser = User(username=rf.cleaned_data['username'],email=rf.cleaned_data['email']) 

Exception Type: TypeError at /register/ 
Exception Value: 'NoneType' object is not subscriptable 
+0

你可以發佈錯誤的堆棧跟蹤?已發佈堆棧跟蹤 – 2010-08-20 19:16:50

+0

。除了顯示錯誤來自哪裏之外,這不是非常有用。 – JPC 2010-08-20 19:22:29

回答

8

clean方法在forms.py中應該返回self.cleaned_data,如果它沒有引發錯誤。

目前,它返回無(因爲你不返回任何東西明確)

+0

謝謝,就是這樣。我沒有意識到我必須返回cleared_data。 – JPC 2010-08-20 19:34:35

1

此行的內容去:

newuser = User(username=rf.cleaned_data['username'],email=rf.cleaned_data['email']) 

在我看來,該表單實例​​不有一個cleaned_data字段。當您嘗試訪問cleaned_data時會出現'NoneType' object is unsubscriptable錯誤,就像您訪問字典時一樣,但cleaned_data實際上是None

檢查(而笨拙地)問題的行前添加print聲明:

print rf.cleaned_data 

確定。在仔細一看,這是最有可能是罪魁禍首:

def clean(self): 
    if self.cleaned_data['cpassword']!=self.cleaned_data['password']: 
     raise forms.ValidationError("Passwords don't match") 

Clean方法應該返回cleaned_data明確。由於這不是,所以會導致錯誤。

相關問題