整理一下django中用户模块自定义model后登录的一些问题:
网上的报错解决不是万能方案,主要还是要自主分析原因,有的是有用但是导包之类的也要看清楚因为自己修改了所以有所变得,不自定义的话又不太好用。
在项目初期决定使用auth_user后就要设置好,如果在项目中期去改动的话就比较麻烦,需要吧数据库以及历史migrations文件除了__init__外全部删掉,数据库备份后全部删掉,再重新执行才能自定义使用上。migrations路径:
python3.10/site-packages/django/contrib/admin/migrations/000x(此处全删掉)
因为考虑到登录用邮箱比较好,所以设置了邮箱unique=True
from django.db import models
from django.contrib.auth.models import AbstractUser
from django.db.models.fields import AutoField, BooleanField, EmailField
# Create your models here.
class User(AbstractUser):
username = models.CharField( # username是必需有的字段,字段名不能错
max_length=20,
null=False,
blank=False,
verbose_name='用户名'
)
password = models.CharField(max_length=256,null = False,blank=False,verbose_name="密码")
plce = models.CharField(max_length=32,null=False,blank=False,verbose_name="地区")
email = EmailField(unique=True) # 给email弄成唯一的
USERNAME_FIELD = 'email' # 默认是username,这个字段有唯一索引
REQUIRED_FIELDS = ['username'] # 指定必填字段,这里不填userna
这时候还需要在setting中添加:(项目.Model类名)
AUTH_USER_MODEL = 'app01.User'
接着执行:
python manage.py makemigrations
python manage.py migrate
就可以发现auth_user表没有了,变成了你的model表
get_user_model()
终端方式:
python manage.py createsuperuser #有超级权限
python manage.py createuser
代码:(未继承)
from django.contrib.auth.models import User
User.objects.create_user(username = '用户名', password = '密码', email = '邮箱', ...)
创建超级:替换成create_superuser()
如果你是自定义了model这样导包则会报错:
解决:
分析:因为我们定义抽象模型类,并且在settings中设置了所以导包需要改变,改为用model的方式
from django.contrib.auth.models import User
然后将其替换为:
from user.models import MyUser as User
重设密码:同样需要是用替换后的包定位自己后
email = request.user.email
obj = User.objects.filter(email = email).first()
obj.set_password(password)
obj.save()
authenticate()的参数提交username,和password这里自己踩了一个很大的坑!
用了超级久去测试解决
解决方法:
按照上面的思路下来,这个方法是没有任何问题的,问题是出在了参数上面,username,和password看上去顾名思义是用户名和密码,但底层确是根据表的unique=True,谁是主唯一来确定,上面表我定义了邮箱所以校验为邮箱!
authenticate()参数只有request(可以忽略),username,password
并非这样使用authenticate(email=email,password=password)
正确使用方法:authenticate(username=email,password=password)返回的结果是一个用户(在此就是邮箱号)
login用法简单只需要在校验后有了user放入即可,logout则只需要request
会自动生成session,与释放session
登陆后在视图中使用request.user.xx(model的字段)即可获得相应数据
login(request,user) #user为校验后的赋值
#登出视图:
def logouts(request):
logout(request)
return redirect("/login/")
额外功能:
is_authenticated()
用来判断当前请求是否通过了认证
def my_view(request):
if not request.user.is_authenticated():
x x x
return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
login_requierd()
auth 给我们提供的一个装饰器工具,用来快捷的给某个FBV视图添加登录校验。
from django.contrib.auth.decorators import login_required
@login_required
def my_view(request):
auth 给我们提供的一个装饰器工具,用来快捷的给某个CBV视图添加登录校验。
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
class Home(views.View):
@method_decorator(login_required)
def get(self, request):
return render(request, 'home.html')
若用户没有登录,则会跳转到django默认的 登录URL '/accounts/login/ ' 并传递当前访问url的绝对路径 (登陆成功后,会重定向到该路径)。如果需要自定义登录的URL,则需要在settings.py文件中通过LOGIN_URL进行修改。 LOGIN_URL = '/login/' # 这里配置成你项目登录页面的路由