2013-07-27 71 views
-1

我想为django网站做一个简单的用户注册表单。这里是商品Django自定义用户身份验证无类型错误

models.py

from django.db import models 
from django import forms 
from django.conf import settings 
from taggit.managers import TaggableManager 
from django.contrib.auth.models import BaseUserManager, AbstractBaseUser 

class UserManager(BaseUserManager): 
    def create_user(self, email, username_input, password=None): 
     if not email: 
      raise ValueError('Users must have an email address') 
     user = self.model(
      email=self.normalize_email(email), 
      username=username_input,  
     ) 
     user.set_password(password) 
     user.save(using=self._db) 
     return user 

    def create_superuser(self, email, username, password): 
     user = self.create_user(email, 
      password=password, 
      username=username, 
     ) 
     user.is_admin = True 
     user.save(using=self._db) 
     return user 

class CustomUser(AbstractBaseUser): 
    # Last login, is active, and password are included automatically 
    username      =  models.CharField(max_length=30, blank=False, unique=True,) 
    email       =  models.EmailField(max_length=150, blank=False) 
    join_date      =  models.DateTimeField(auto_now_add=True) 

    objects = UserManager() 

    USERNAME_FIELD = 'username' 
    REQUIRED_FIELDS = ['email'] 

class UserForm(forms.Form): 
    email      =   forms.EmailField(max_length=150, required=True) 
    username     =   forms.CharField(max_length=30, required=True) 
    password1     =   forms.CharField(label='Password', widget=forms.PasswordInput(), max_length=30, required=True) 
    password2     =   forms.CharField(label='Password confirmation', widget=forms.PasswordInput(), max_length=30, required=True) 

views.py

from django.http import HttpResponse 
from django.template import RequestContext, loader 
from django.shortcuts import render 
from myapp.models import * 

def signup(request): 
    if request.method == 'POST': # If the form has been submitted... 
     if not request.POST['password1'] == request.POST['password2']: 
      return HttpResponse("HOLY JESUS BATMAN YOUR PASSWORDS DONT MATCH!") 
     form = UserForm(request.POST) # A form bound to the POST data 
     if form.is_valid(): # All validation rules pass 
      password = request.POST['password1'] 
      username = request.POST['username'] 
      email = request.POST['email'] 
      manager = UserManager() 
      manager.create_user(
       email, 
       username, 
       password, 
      ) 
      return HttpResponse('Huzzah! Success!') 
    else: 
     form = UserForm() # An unbound form 
    return render(request, 'signup.html', { 
     'form': form, 
    }) 

跟踪

Environment: 


Request Method: POST 
Request URL: http://10.0.1.25:8000/signup/ 

Django Version: 1.5.1 
Python Version: 2.7.3 
Installed Applications: 
('django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.sites', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'taggit', 
'bild', 
'bildloguser') 
Installed Middleware: 
('django.middleware.common.CommonMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware') 


Traceback: 
File "/home/bildlog/virtenv/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 
    115.       response = callback(request, *callback_args, **callback_kwargs) 
File "/home/user/myapp/myapp/views.py" in signup 
    19.     password, 
File "/home/user/myapp/myapp/models.py" in create_user 
    13.    username=username_input,  

Exception Type: TypeError at /signup/ 
Exception Value: 'NoneType' object is not callable 

所以,我有蜜蜂现在拉我的头发一段时间,尝试各种各样的东西,看各种教程,我仍然得到同样的错误。我知道它很多,但我认为关注的是create_user函数。任何帮助将被超赞赏,看到这将最终导致我疯狂。

感谢

回答

1

当您在视图定义类

class CustomUser(AbstractBaseUser): 
    ... 
    objects = UserManager() 

那么管理者设置,调用CustomUser.objects.create_user()

 CustomUser.objects.create_user(
      email, 
      username, 
      password, 
     ) 

是无效的实例在视图管理器,如以下。

 manager = UserManager() 
     manager.create_user(
      email, 
      username, 
      password, 
     ) 

查看Django docs on Managers了解更多信息。

+0

非常感谢,但是当我尝试你的建议时,我得到一个'类型对象'UserManager'没有属性'objects''错误。我还更新了代码以准确显示真正的代码(用UserManager替换了BildLogUserManager)。 – dirtshell

+0

您更新的代码仍然在视图中实例化一个管理器('manager = UserManager()')。不要这样做,这是无效的。如果您继续使用该代码,没有人能够为您提供帮助。 – Alasdair

相关问题