[英]TypeError at / string indices must be integers
我正在嘗試制作一個自定義用戶創建表單,用戶可以在其中鍵入用戶名,密碼和電子郵件以在我的站點中注冊。 但我無法調試此錯誤。 它指的是什么類型的錯誤? 我使用django 2.1和postgresql 10.3作為db。
forms.py
from django import forms
class SignUpForm(forms.Form):
username = forms.CharField(max_length=20)
password = forms.CharField(widget=forms.PasswordInput(attrs={'placeholder':'password'}))
password_confirmation = forms.CharField(widget=forms.PasswordInput(attrs={'placeholder':'password confirmation'}))
email = forms.EmailField()
def clean(self):
password = self.cleaned_data.get('password')
password_confirmation = self.cleaned_data.get('password_confirmation')
print(password)
print(password_confirmation)
if password != password_confirmation:
raise forms.ValidationError('Password Must Match')
return password
urls.py
from django.urls import path
from .views import SignUpView
urlpatterns = [
path('',SignUpView,name = 'signup')
]
views.py
from django.shortcuts import render
from .forms import SignUpForm
from django.contrib.auth.models import User
from django.shortcuts import HttpResponse
def SignUpView(request):
if request.method == 'POST':
form = SignUpForm(request.POST)
if form.is_valid():
username = form.cleaned_data['username']
password = form.cleaned_data['password']
email = form.cleaned_data['email']
user = User(request,username=username,email=email)
user.set_password(password)
user.save()
return HttpResponse('User Created')
else:
form =SignUpForm()
return render(request,'signup.html',{'form':form})
TraceBack錯誤
環境:
Request Method: POST
Request URL: http://127.0.0.1:8000/
Django Version: 2.0.5
Python Version: 3.6.3
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'account']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback:
File "C:\Users\HP\AppData\Local\Programs\Python\Python36\lib\site-packages\django\core\handlers\exception.py" in inner
35. response = get_response(request)
File "C:\Users\HP\AppData\Local\Programs\Python\Python36\lib\site-packages\django\core\handlers\base.py" in _get_response
128. response = self.process_exception_by_middleware(e, request)
File "C:\Users\HP\AppData\Local\Programs\Python\Python36\lib\site-packages\django\core\handlers\base.py" in _get_response
126. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\HP\Desktop\muvi_2\account\views.py" in SignUpView
10. username = form.cleaned_data['username']
Exception Type: TypeError at /
Exception Value: string indices must be integers
您將clean
函數定義為:
class SignUpForm(forms.Form):
# ...
def clean(self):
password = self.cleaned_data.get('password')
# ...
return password
然而, super(..)
應該返回cleaned_data
,所以是字典。 通過覆蓋它並返回password
, form.cleaned_data
“ form.cleaned_data
”不再是類字典對象,而是字符串。 或者像表格清理文檔[Django-doc]指定:
表單子類的
clean()
方法可以執行需要訪問多個表單字段的驗證。 您可以在此處進行檢查,例如“如果提供了字段A,則字段B必須包含有效的電子郵件地址”。 如果願意, 此方法可以返回完全不同的字典 ,該字典將用作cleaned_data
。
因此, password
將取代cleaned_data
(並且它不是類似字典的對象),因此我們無法再獲得form.cleaned_data['username']
,因為'some_password'['username']
,當然對Python沒有意義。
我們可以通過在末尾返回self.cleaned_data
來重寫clean
函數(例如通過調用super().clean()
函數):
from django import forms
class SignUpForm(forms.Form):
# ...
def clean(self):
password = self.cleaned_data.get('password')
password_confirmation = self.cleaned_data.get('password_confirmation')
print(password)
print(password_confirmation)
if password != password_confirmation:
raise forms.ValidationError('Password Must Match')
return super().clean()
其他錯誤 :在驗證表單后,您的目標是創建一個User
對象:
user = User(request, username=username,email=email)
然而,對我來說,為什么你在這里使用request
對象並不是一個問題。 我認為它應該是:
user = User(username=username, email=email, password=hashed_password)
您還需要首先哈希密碼,否則它是一個嚴重的安全威脅 。 有關更多信息,請參閱有關密碼散列的Django文檔 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.