forms.py中的Django TypeError

时间:2017-07-06 05:53:32

标签: python html django forms django-forms

我正在pythonanywhere.com上部署我的Django应用,并在注册用户TypeError at /registration/ argument 1 must be str, not list时收到此错误。

我正在检查用户是否已经在数据库中出现,然后在forms.py中抛出验证错误。

由于此代码而怀疑错误。

forms.py

class SignUpForm(forms.Form):
    email = forms.EmailField(max_length=254, help_text='Required. Inform a valid email address.')
    name = forms.CharField(max_length=100, required=False, help_text='Required.')
    password = forms.CharField(max_length=1000, required=False, help_text='Required.')
    role = forms.CharField()

    def clean(self):
        cleaned_data = super(SignUpForm, self).clean()
        name = cleaned_data.get("name")
        email = cleaned_data.get("email")
        password = cleaned_data.get("password")
        role = cleaned_data.get("role")
        # validate email
        if role == 'Author':
            user = UserSignup.objects.filter(email=email)
            #error suspected here--
            if user.first() is not None:
                raise forms.ValidationError(
                "Email already registered. Try again.")
        elif role == 'Publisher':
            user = PubSignup.objects.filter(email=email)
            if user.first() is not None:
                raise forms.ValidationError(
                "Email already registered. Try again.")

    class Meta:
        model = UserSignup
        fields = ('email', 'name', 'password')

models.py

class UserSignup(models.Model):
    email = models.CharField(unique=True, max_length=254)
    name = models.CharField(max_length=100)
    password = models.CharField(max_length=1000)
    created_date = datetime.now()

    class Meta:
        app_label = 'UserSignup'

    def __str__(self):
        return self.email


class PubSignup(models.Model):
    email = models.CharField(unique=True, max_length=254)
    name = models.CharField(max_length=100)
    password = models.CharField(max_length=1000)
    created_date = datetime.now()

    class Meta:
        app_label = 'PubSignup'

    def __str__(self):
        return self.email

views.py

if form.is_valid():
        if form.role == "Author":
            p = UserSignup(
                name=form.cleaned_data.get('name'),
                email=form.cleaned_data.get('email'),
                password=form.cleaned_data.get('password')
            )
            p.save()
            success = True
        elif form.role == "Publisher":
            p = PubSignup(
                name=form.cleaned_data.get('name'),
                email=form.cleaned_data.get('email'),
                password=form.cleaned_data.get('password')
            )
            p.save()
            success = True

错误追溯

Traceback:

File "/home/zerocod3r/lib/python3.5/site-
packages/django/core/handlers/exception.py" in inner
42.             response = get_response(request)

File "/home/zerocod3r/lib/python3.5/site-
packages/django/core/handlers/base.py" in _get_response
187.  response = self.process_exception_by_middleware(e, 
request)

File "/home/zerocod3r/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
185.  response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/home/zerocod3r/PublicationPlatform/mainapp/views.py" in signup_user
26. if form.is_valid():

File "/home/zerocod3r/lib/python3.5/site-packages/django/forms/forms.py" in is_valid
169. return self.is_bound and not self.errors

File "/home/zerocod3r/lib/python3.5/site-packages/django/forms/forms.py" in errors
161. self.full_clean()

File "/home/zerocod3r/lib/python3.5/site-packages/django/forms/forms.py" in full_clean
371. self._clean_form()

File "/home/zerocod3r/lib/python3.5/site-packages/django/forms/forms.py" in _clean_form
398. cleaned_data = self.clean()

File "/home/zerocod3r/PublicationPlatform/mainapp/forms.py" in clean
27. if user.first() is not None:

File "/home/zerocod3r/lib/python3.5/site-packages/django/db/models/query.py" in first
556. objects = list((self if self.ordered else self.order_by('pk'))[:1])

File "/home/zerocod3r/lib/python3.5/site-packages/django/db/models/query.py" in __iter__
256. self._fetch_all()

File "/home/zerocod3r/lib/python3.5/site-packages/django/db/models/query.py" in _fetch_all
1087. self._result_cache = list(self.iterator())

File "/home/zerocod3r/lib/python3.5/site-packages/django/db/models/query.py" in __iter__
54. results = compiler.execute_sql()

File "/home/zerocod3r/lib/python3.5/site-packages/django/db/models/sql/compiler.py" in execute_sql
833. cursor = self.connection.cursor()

File "/home/zerocod3r/lib/python3.5/site-packages/django/db/backends/base/base.py" in cursor
231. cursor = self.make_debug_cursor(self._cursor())

File "/home/zerocod3r/lib/python3.5/site-packages/django/db/backends/base/base.py" in _cursor
204. self.ensure_connection()

File "/home/zerocod3r/lib/python3.5/site-packages/django/db/backends/base/base.py" in ensure_connection
199. self.connect()

File "/home/zerocod3r/lib/python3.5/site-packages/django/db/backends/base/base.py" in connect
171. self.connection = self.get_new_connection(conn_params)

File "/home/zerocod3r/lib/python3.5/site-packages/django/db/backends/sqlite3/base.py" in get_new_connection
209. conn = Database.connect(**conn_params)

Exception Type: TypeError at /registration/
Exception Value: argument 1 must be str, not list

我的settings.py

import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

SECRET_KEY = 'some-text'
DEBUG = True

ALLOWED_HOSTS = ['zerocod3r.pythonanywhere.com','*']

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'mainapp',
]

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',
]

ROOT_URLCONF = 'PublicationPlatform.urls'

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    #'DIRS': [os.path.join(BASE_DIR, 'templates')]
    'DIRS': ['/home/zerocod3r/PublicationPlatform/templates/']
    ,
    'APP_DIRS': True,
    'OPTIONS': {
        'context_processors': [
            'django.template.context_processors.debug',
            'django.template.context_processors.request',
            'django.contrib.auth.context_processors.auth',
            'django.contrib.messages.context_processors.messages',
        ],
    },
},
]

WSGI_APPLICATION = 'PublicationPlatform.wsgi.application'

DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}

AUTH_PASSWORD_VALIDATORS = [
{
    'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
    'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
    'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
    'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]


MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

STATICFILES_DIRS = [
'/home/zerocod3r/PublicationPlatform/mainapp/static/',
]

STATIC_ROOT = os.path.join(BASE_DIR, 'mainapp/static')
STATIC_URL = '/static/'

1 个答案:

答案 0 :(得分:1)

您可以重新编写clean()方法,可能有点像这样,

model = None
if role == 'Author':
    model = UserSignup
elif role == 'Publisher':
    model = PubSignup
if model is not None:
    try:
        user = model.objects.get(email=email)
        raise forms.ValidationError(
                "Email already registered. Try again.")
    except:
        pass