[英]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.