我有一個用戶注冊表,如下面的代碼所示。一旦提交了表單并且該行成功添加到資料庫中,就會發生錯誤。
視圖.py
class UserCreateView(CreateView):
form_class = UserCreateForm
model = User
template_name = 'internethq/user_form.html'
success_url = '/internethq/login'
表格.py
class UserCreateForm(UserCreationForm):
first_name = forms.CharField(required=True)
last_name = forms.CharField(required=True)
email = forms.EmailField(required=True)
class Meta:
model = User
fields = [
'first_name',
'last_name',
'username',
'email',
'password1',
'password2'
]
def clean_password1(self):
exp = re.compile("^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$")
if exp.match(self.cleaned_data['password1']):
return self.cleaned_data['password1']
else:
raise ValidationError('Must contain one uppercase letter, one lowercase letter, one number and one special character.')
def save(self, commit = True):
user = super().save(commit = False)
user.first_name = self.cleaned_data['first_name']
user.last_name = self.cleaned_data['last_name']
user.email = self.cleaned_data['email']
if commit:
user.save()
錯誤
Internal Server Error: /internethq/signup/
AttributeError at /internethq/signup/ 'NoneType' object has no attribute '__dict__' Traceback (most recent call last):
bit of trimming here...
File "/home/togi/atollaviation/env/lib/python3.6/site-packages/django/views/generic/base.py", line 70, in view return self.dispatch(request, *args, **kwargs)
File "/home/togi/atollaviation/env/lib/python3.6/site-packages/django/python3.6/site-packages/django/views/generic/edit.py", line 113, in get_success_url url = self.success_url.format(**self.object.__dict__)
我認為 success_url 看起來是正確的,但我遺漏了錯誤嗎?
此代碼在開發服務器中運行良好。
謝謝你的幫助。
uj5u.com熱心網友回復:
您需要從Form.save方法回傳創建的物件
class UserCreateForm(UserCreationForm):
...
def save(self, commit = True):
user = super().save(commit = False)
user.first_name = self.cleaned_data['first_name']
user.last_name = self.cleaned_data['last_name']
user.email = self.cleaned_data['email']
if commit:
user.save()
return user
回傳的物件用于很多地方,包括通用表單處理視圖。通常只是回傳創建的物件,有時是在保存之前更改物件,類似于下面
obj = form.save(commit=False)
obj.attr = value
obj.save()
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/343298.html
上一篇:型別錯誤:_getfullpathname:路徑應該是字串、位元組或os.PathLike,而不是串列(Django)
