/字符串索引处的TypeError必须为整数

时间:2018-08-19 08:56:09

标签: python django

我正在尝试制作一个定制的用户创建表单,用户可以在其中键入用户名,密码和电子邮件以在我的网站中注册。但我无法调试此错误。它指的是哪种类型错误?我正在使用django 2.1和postgresql 10.3作为数据库。

forms.py

exceptions.log

urls.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

views.py

from django.urls import path
from .views import SignUpView
urlpatterns = [
    path('',SignUpView,name = 'signup')
]

TraceBack错误

环境:

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})

1 个答案:

答案 0 :(得分:3)

您将clean函数定义为:

class SignUpForm(forms.Form):

    # ...

    def clean(self):
        password = self.cleaned_data.get('password')
        # ...
        return password

super(..)应该返回cleaned_data,因此是字典。通过覆盖它并返回passwordform.cleaned_data的“最终产品”不再是像字典的对象,而是一个字符串。或像documentation on form-cleaning [Django-doc]指定的那样:

  

表单子类的clean()方法可以执行验证,该验证需要访问多个表单字段。您可以在此处进行检查,例如“如果提供了字段A,则字段B必须包含有效的电子邮件地址”。 此方法可以根据需要返回完全不同的字典,该字典将用作cleaned_data

因此,password将代替cleaned_data(并且它不是类似字典的对象),因此我们不能再获得form.cleaned_data['username'],因为{ {1}}对Python毫无意义。

我们可以通过返回结尾的'some_password'['username'](例如,调用clean函数)来重写self.cleaned_data函数:

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

您还需要先 hash 密码,因为否则会这是严重的安全威胁。有关更多信息,请参见the Django documentation on password hashing