简体   繁体   English

如何在 django 中使用自定义用户 model 进行登录验证

[英]how to make login authentication with custom user model in django

i have made a custom user model.我已经创建了一个自定义用户 model。 signup and logout is working fine.注册和注销工作正常。 but i have made a login form using that model.但我已经使用 model 制作了一个登录表单。 but whenever i try to submit the form,after authentication it is supposed to redirect me to home page.但是每当我尝试提交表单时,经过身份验证后,它应该将我重定向到主页。 but unfortunately it does not authenticate and redirect me to login page repeatedly.但不幸的是,它不会重复验证并将我重定向到登录页面。 how should i solve this?我应该如何解决这个问题?

my models.py我的模型.py

from django.db import models

from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager



class SignUpManager(BaseUserManager):
    def create_user(self, email,age,name, username, password=None):
        #if not email:
            #raise ValueError("insert user")
        if not username:
            raise ValueError("insert username")
        if not name:
            raise ValueError("insert name")
        if not age:
            raise ValueError("insert age")
        user = self.model(
           email=self.normalize_email(email),
           username=username,
           age=age,
           name=name,
        )
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self,email,name,age,username, password):

        user = self.create_user(
            email=self.normalize_email(email),
            username=username,
            password=password,
            age=age,
            name=name,
        )
        user.is_admin = True
        user.is_staff = True
        user.is_superuser = True

        user.save(using=self._db)
        return user


class UserSignupModel(AbstractBaseUser):
    email = models.EmailField(verbose_name="email", max_length=60,blank=True,null=True)
    age = models.CharField(max_length=15)
    name = models.CharField(max_length=15)
    username = models.CharField(max_length=15, unique=True)
    date_joined = models.DateTimeField(verbose_name="date joined", auto_now_add=True)
    last_login = models.DateTimeField(verbose_name="last login", auto_now=True)

    is_admin = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)

    USERNAME_FIELD = "username"
    REQUIRED_FIELDS = ['email','name','age']
    objects = SignUpManager()

    def __str__(self):
        return self.name

    def has_perm(self, perm, obj=None):
        return self.is_admin

    def has_module_perms(self, app_label):
        return True
#migrate --run-syncdb in case no work

my forms.py我的 forms.py

from django import forms

from django.contrib.auth.forms import UserCreationForm
from diabetes.models import UserSignupModel
from django.contrib.auth import login,authenticate,logout


class UserSignupForm(UserCreationForm):
    email=forms.EmailField(max_length=60,help_text="add a valid email address",required=False)
    name=forms.CharField(max_length=15,help_text="add a valid name")
    age=forms.CharField(max_length=15)

    class Meta:
        model=UserSignupModel
        fields=('email','name',"username",'age',"password1","password2")



class UserLoginForm(forms.ModelForm):
    password=forms.CharField(label="password",widget=forms.PasswordInput)

    class Meta:
        model=UserSignupModel
        fields=("email","password")

        def clean(self):
            if self.is_valid():

                email=self.cleaned_data('email')
                password=self.cleaned_data('password')

                if not authenticate(email=email,password=password):
                    raise forms.ValidationError("Invalid LOGIN")

my views.py我的观点.py

from django.shortcuts import render,redirect
from django.contrib.auth import login,authenticate,logout
from diabetes.forms import UserSignupForm,UserLoginForm



# Create your views here.
def home(request):
    return render(request,'diabetes/home.html')

def signupuser(request):
    context={}
    if request.POST:
        form=UserSignupForm(request.POST)
        if form.is_valid():
            form.save()
            email=form.cleaned_data.get('email')
            raw_password=form.cleaned_data.get('password1')
            name=form.cleaned_data.get('name')
            age=form.cleaned_data.get('age')
            username=form.cleaned_data.get('username')

            account=authenticate(email=email,password=raw_password,name=name,age=age,username=username)
            login(request,account)
            return redirect('home')
        else:
            context["reg_form"]=form

    else:
        form = UserSignupForm()
        context["reg_form"] = form
    return render (request,'diabetes/signupuser.html',context)


def logoutuser(request):

    logout(request)
    return redirect('home')

def loginuser(request):
    context={}

    if request.method=="POST":

        form=UserLoginForm(request.POST)
        if form.is_valid():

            password=request.POST["password"]
            email=request.POST["email"]
            user=authenticate(email=email,password=password)
            if user:
                login(request,user)
                return redirect("home")

    else:
        form=UserLoginForm()


    context['form']=form
    return render(request,"diabetes/loginuser.html",context)

my loginuser.html我的登录用户。html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<form method="POST">
    {% csrf_token %}
    {% for field in form %}
        <p>

        {{ field.label_tag }}
        {{ field}}
        {% if field.help_text %}
             <small>{{ field.help_text }}</small>
        {% endif %}
         {% for error in field.errors %}
             <strong>{{ error }}</strong>
        {% endfor %}
        {% if form.non_field_errors %}
             <small>{{ form.non_field_errors}}</small>
        {% endif %}
        </p>
    {% endfor %}

    <input type="submit">SUBMIT</input>
</form>

</body>
</html>

Uhm, is it possible that u just forgott to define the redirect url after login?嗯,您是否可能只是忘记在登录后定义重定向 url ? Can u please check this, im not sure!你能检查一下吗,我不确定!

settings.py设置.py

LOGIN_REDIRECT_URL = '/your-path'

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM