当前位置:   article > 正文

Django框架之Admin用户系统复用_django admin user

django admin user

前言

这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题

于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。

微信小程序搜索:Python面试宝典

或可关注原创个人博客:https://lienze.tech

也可关注微信公众号,不定时发送各类有趣猎奇的技术文章:Python编程学习

复用admin用户系统

from django.contrib.auth.models import User

用户字段
class User(AbstractUser):
  	username = models.CharField(
        _('username'),
        max_length=150,
        unique=True,
        help_text=_('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'),
        validators=[username_validator],
        error_messages={
            'unique': _("A user with that username already exists."),
        },
    )
    # 必选。少于等于30个字符。 用户名可以包含字母、数字、_、@、+、.和-字符
    first_name = models.CharField(_('first name'), max_length=30, blank=True)
    # 可选。 少于等于30个字符
    last_name = models.CharField(_('last name'), max_length=150, blank=True)
    # 可选。少于30个字符
    email = models.EmailField(_('email address'), blank=True)
    # 可选。邮箱地址
    is_staff = models.BooleanField(
        _('staff status'),
        default=False,
        help_text=_('Designates whether the user can log into this admin site.'),
    )
    # 布尔值。指示用户是否可以访问Admin站点
    is_active = models.BooleanField(
        _('active'),
        default=True,
        help_text=_(
            'Designates whether this user should be treated as active. '
            'Unselect this instead of deleting accounts.'
        ),
    )
    # 布尔值。用户的账号是否激活。常使用这个标志为False来代替删除账号
    date_joined = models.DateTimeField(_('date joined'), default=timezone.now
    # 账户创建的时间。当账号创建时,默认设置为当前的datetime                                
    password = models.CharField(_('password'), max_length=128)
    # 必选。 密码的哈希及元数据。(Django不保存原始密码)。原始密码可以无限长而且可以包含任意字符
    last_login = models.DateTimeField(_('last login'), blank=True, null=True)
    # 用户最后一次登录的时间。如果这个用户没有登录过,这个字段将会是null,默认设置为的当前的datetime
    is_superuser = models.BooleanField(
        _('superuser status'),
        default=False,
        help_text=_(
            'Designates that this user has all permissions without '
            'explicitly assigning them.'
        ),
    )
    # 布尔值。指定这个用户拥有所有的权限而不需要给他们分配明确的权限                                   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
用户实例方法
  • get_username()

获取到当前的用户的用户名属性

  • is_authenticated()

检查用户是否已通过认证

  • is_anonymous()

检查用户是否未通过认证

  • set_password(password)

设置保存用户的密码,并且会负责密码的哈希加密工作

通常修改密码之后还需要调用save()方法进行数据更新

用户表方法
  • create_user(username, email=None, password=None, **extra_fields)

django的用户创建需要使用User表管理器中的create_user函数进行

该函数可以创建并保存一个用户

  • create_superuser(username, email, password, **extra_fields)

与上一个创建用户函数功能相同,但是会额外设置用户的is_staffis_superuser属性为True

创建一个admin后台超级用户

其他方法
from django.contrib.auth import authenticate
authenticate(username,password)
# 验证是否为合法用户,如果用户存在合法则返回一个user对象
  • 1
  • 2
  • 3

from django.contrib.auth import logout,login
logout(request)
# 清除当前浏览器下用户session
login(request,user)
# 登录并保存当前用户session,参数user必须为使用authenticate验证过后的User对象
  • 1
  • 2
  • 3
  • 4
  • 5
用户登录
  • 登陆所需表单类
#forms.py
from django import forms
from django.contrib.auth.models import User
import re
class LoginForm(forms.Form):
	username = forms.CharField(label="用户名",required=True,)
    password = forms.CharField(
        widget=forms.PasswordInput(),
        label='密码',
        required=True,
        )
    def clean_username(self):
        username = self.cleaned_data.get("username").strip()
        try:
            User.objects.get(username=username)
        except User.DoesNotExist:
            raise forms.ValidationError("用户名 %s 不存在" % username)
        else:
                return username
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 登录所需模板页面
<!DOCTYPE html>
<html>
<head>
	<title>登录</title>
</head>
<body>
	<form action='/login/' method="POST">
		{% csrf_token %}
		{{ errors }}
			{% for field in form %}
				<label>
				{% if field.errors %}
				<ul>
					{% for error in field.errors%}
						<li>{{ error }}</li>
					{% endfor %}
				</ul>
				{% endif %}
				</label>
			<p>{{ field.label }}: {{ field }}</p>
		{% endfor %}
	<input type="submit" value="登录">
</form>
</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 登陆主要视图逻辑
#views.py
from django.contrib.auth import authenticate,logout as auth_logout,login as auth_login
def login(request):
	if request.method == 'GET':
		form = userForm()
		return render(request, "login.html",{'form':form})
	form = userForm(request.POST)
    username = form.data['username']
    password = form.data['password']
    user = authenticate(username=username,password=password)
    # 验证当前账号密码是否匹配合法
    if user and user.is_active:
        auth_login(request, user)
        return redirect('/')
    else:
		return render(request, "login.html",{'form':form,'errors':'用户名或密码错误'})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

在用户登录成功之后,将会重定向到主页,主页展示当前登录用户

登录用户可以直接在request.user属性中获取到,主页的模板内容如下

  • 主页模板
<!DOCTYPE html>
<html>
<head>
	<title>主页</title>
</head>
<body>
	欢迎你: {{ user }}
</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

主页视图函数可以通过装饰器@login_required或判断is_authenticated状态来查看用户是否登录

只有登录用户可以访问该站点

当使用装饰器@login_required时,需要在settings下设置LOGIN_URL = '/login/'

将该属性设置为登录路由

  • 首页视图函数
from django.contrib.auth.decorators import login_required
#@login_required
def index(request):
    if request.user.is_authenticated():
        return render(request, "index.html")
    else:
        return redirect('/login/')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
注册功能
  • 注册所需表单
#forms.py
class RegisterForm(forms.Form):
    username = forms.CharField(label="用户名",
        max_length=30,
        required=True,
        error_messages={'max_length':'账号长度最长为30'},
    )
    password = forms.CharField(label="密码",
        min_length=6, max_length=30, 
        widget=forms.PasswordInput(), 
        required=True,
            error_messages={'min_length':'密码长度最短为6'},
        )
	check_password = forms.CharField(label="重复密码", 
		min_length=6, max_length=30, 
		widget=forms.PasswordInput(), 
		required=True,
		error_messages={'min_length':'密码长度最短为6'},
	)
	def clean_check_password(self):
		password = self.cleaned_data.get('password')
		check_password = self.cleaned_data.get('check_password')
		if password != check_password and password and check_password:
			raise ValidationError("重复输入密码错误")
	def clean_username(self):
		username = self.cleaned_data.get('username')
		if username[:1] == '_':
			raise forms.ValidationError("用户名不能以下划线打头")
		try:
			User.objects.get(username=username)
		except User.DoesNotExist:
			return username 
		raise forms.ValidationError("用户名已存在")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

表单中,将对用户两次输入的密码进行校验并判断是否为空,而且不允许下划线作为用户名的开头字符

  • 注册主要视图函数逻辑
#views.py
def register(request):
    if request.method == 'POST':
        form = RegisterForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data['username']
            password = form.cleaned_data['password']
            User.objects.create_user(username=username,password=password)
            user = authenticate(username=username,password=password)
            auth_login(request, user)
            return redirect('/')
    else :
        form = RegisterForm()
    return render(request, "register.html",{'form':form})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

通过表单验证,并获取到对应用户账号密码,创建成功之后,验证并登录,并且重定向到首页

  • 主页模板页面
<!DOCTYPE html>
<html>
<head>
	<title>注册</title>
</head>
<body>
	{% if request.user.is_authenticated %}
	 	<p>您已登录:</p> {{ user }}
	{% else %}
	<form action='/register/' method="POST">
		{% csrf_token %}
		{% for field in form %}
			<label>
			{% if field.errors %}
			<ul>
			{% for error in field.errors%}
				<li>{{ error }}</li>
				{% endfor %}
			</ul>
			{% endif %}
			</label>
			<p>{{ field.label }}: {{ field }}</p>
		{% endfor %}
		<input type="submit" value="注册">
	</form>
	{% endif %}
</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

当用户已经登录时,显示当前登录用户,反之则展示表单,以供用户填写

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/306401
推荐阅读
相关标签
  

闽ICP备14008679号