无法使用自定义表单上创建的用户登录 - Django

时间:2016-02-14 16:34:18

标签: django forms django-registration django-login django-custom-user

我已经为创建用户编写了一个自定义表单 登录适用于在终端上使用“python manage.py createsuperuser”创建的用户,但它不适用于在网站上创建的用户。我检查过,创作形式有效;我的意思是,用户已创建。

这是表格

class CustomUserCreationForm(UserCreationForm):
"""
A form that creates a user, with no privileges, from the given email and password.
"""

def __init__(self,  *args, **kwargs):
    super(CustomUserCreationForm, self).__init__(*args, **kwargs)

class Meta:
    model = CustomUser
    fields = ("email",)

模型

class CustomUser(AbstractBaseUser, PermissionsMixin):
    username     = models.CharField(max_length=254, unique=True, null=True)
    first_name   = models.CharField(max_length=254, blank=True)
    second_name  = models.CharField(max_length=254, blank=True)
    email        = models.EmailField(blank=True, unique=True)
    address1     = models.CharField(max_length=254, blank=True)
    address2     = models.CharField(max_length=254, blank=True)
    area_code    = models.CharField(max_length=20, blank=True)
    country_code = models.CharField(max_length=10, blank=True)
    date_joined  = models.DateTimeField(_('date joined'), default=datetime.now())
    is_active    = models.BooleanField(default=True)
    is_admin     = models.BooleanField(default=False)
    is_staff     = models.BooleanField(default=False)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username', 'address1', 'address2', 'area_code', 'country_code']

    objects = CustomUserManager()

    class Meta:
        verbose_name = _('user')
        verbose_name_plural = _('users')

    def get_absolute_url(self):
        return "/users/%s" % urlquote(self.email)

    def get_full_name(self):
        """
        Returns the first_name plus the last_name, with a space in between.
        """
        return full_name.strip()

    def get_short_name(self):
        """
        Returns the first name for the user.
        """ 
        return self.first_name

    def email_user(self, subject, message, from_email=None):
        """
        Sends an email to this user.
        """
        send_email(subject, message, from_email, [self.email])

注册视图

def register(request):

    registered = False

    if request.method == 'POST':
        user_form = CustomUserCreationForm(data=request.POST)

        if user_form.is_valid():
            user = user_form.save()

            user.set_password(user.password)
            user.save()

            registered = True

        else:
            print user_form.errors
    else:
        user_form = CustomUserCreationForm()

    return render(request, 'register.html', {'user_form': user_form, 'registered': registered})

登录视图

def login(request):

    if request.method == 'POST':
        login_form = CustomUserLoginForm(data=request.POST)

        username = request.POST.get('username')
        password = request.POST.get('password')

        user = auth.authenticate(username=username, password=password)

        if user:
            if user.is_active:
                auth.login(request, user)
                return HttpResponseRedirect('/')
            else:
                return HttpResponse("Your account is disabled.")
        else:
            print "Invalid login details: {0}, {1}".format(username, password)
            return HttpResponse("Invalid login details supplied. Get back to the <a href=\"/\">homepage</a>.")

    else:
        login_form = CustomUserLoginForm()

    return render(request, 'login.html', {'login_form': login_form})

我在这里想念的是什么? 谢谢!

2 个答案:

答案 0 :(得分:1)

首先修复课程:

class CustomUser(AbstractUser, PermissionsMixin):

AbstractUser是一个真正的用户模型,BaseUser只是元类。

要创建新用户,您应该在表单或注册视图中使用此行:

User.objects.create_user(username=username,email=email,password=password)

请注意set_password用于更改密码,并在密码更改后注销该用户。

答案 1 :(得分:0)

近三天我试图克服同样的问题。我甚至写了AUTHENTICATION_BACKEND。只有在此之后,表单上才显示用户未处于活动状态的消息。在保存方法中,我将True分配给user.is_active

def save(self):
    user = super().save(commit=False)
    user.is_active = True
    user.save()

这对我有用。我希望它对你也有用。 (注意:我不知道规则并发布相同的问题也可以提供相同的问题以帮助其他人,当得到通知不要这样做时。如果有人会看到我对其他问题的回答,请忽略它。上面的答案是编辑的,主要与这个确切的问题有关)

相关问题