1 Auth模块是什么
Auth模块是Django自带的用户认证模块:
我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统。此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能,这还真是个麻烦的事情呢。
Django作为一个完美主义者的终极框架,当然也会想到用户的这些痛点。它内置了强大的用户认证系统–auth,它默认使用 auth_user 表来存储用户数据。
1 2 3 4 |
1<span style="color: rgba(0, 0, 0, 1);"> django提供的用户认证,创建,修改密码。。。用户相关操作 </span>2<span style="color: rgba(0, 0, 0, 1);"> 不需要创建用户表了,默认带了 </span>3<span style="color: rgba(0, 0, 0, 1);"> 插入数据(创建用户): python3 manage.py createsuperuser</span> |
2 auth模块常用方法
1 |
<span style="color: rgba(0, 0, 255, 1);">from</span> django.contrib <span style="color: rgba(0, 0, 255, 1);">import</span> auth |
authenticate()
提供了用户认证功能,即验证用户名以及密码是否正确,一般需要username 、password两个关键字参数。
如果认证成功(用户名和密码正确有效),便会返回一个 User 对象。
authenticate()会在该 User 对象上设置一个属性来标识后端已经认证了该用户,且该信息在后续的登录过程中是需要的。
用法:
1 2 3 4 5 |
<span style="color: rgba(0, 128, 0, 1);">#</span><span style="color: rgba(0, 128, 0, 1);"> 导入auth_user表</span> <span style="color: rgba(0, 0, 255, 1);">from</span> django.contrib.auth.models <span style="color: rgba(0, 0, 255, 1);">import</span><span style="color: rgba(0, 0, 0, 1);"> User </span><span style="color: rgba(0, 128, 0, 1);">#</span><span style="color: rgba(0, 128, 0, 1);"> 导入认证</span> <span style="color: rgba(0, 0, 255, 1);">from</span> django.contrib.auth <span style="color: rgba(0, 0, 255, 1);">import</span><span style="color: rgba(0, 0, 0, 1);"> authenticate user </span>= authenticate(username=<span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">usernamer</span><span style="color: rgba(128, 0, 0, 1);">'</span>,password=<span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">password</span><span style="color: rgba(128, 0, 0, 1);">'</span>) |
login(HttpRequest, user)
该函数接受一个HttpRequest对象,以及一个经过认证的User对象。
该函数实现一个用户登录的功能。它本质上会在后端为该用户生成相关session数据。
用法:
1 2 3 4 |
<span style="color: rgba(0, 0, 255, 1);">from</span> django.contrib.auth <span style="color: rgba(0, 0, 255, 1);">import</span><span style="color: rgba(0, 0, 0, 1);"> login </span><span style="color: rgba(0, 128, 0, 1);">#</span><span style="color: rgba(0, 128, 0, 1);"> 登录成功后调用</span> login(request, user) |
logout(request)
该函数接受一个HttpRequest对象,无返回值。
当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。
用法:
1 2 3 4 5 |
<span style="color: rgba(0, 0, 255, 1);">from</span> django.contrib.auth <span style="color: rgba(0, 0, 255, 1);">import</span><span style="color: rgba(0, 0, 0, 1);"> logout </span><span style="color: rgba(0, 0, 255, 1);">def</span><span style="color: rgba(0, 0, 0, 1);"> auth_logout(request): logout(request) </span><span style="color: rgba(0, 128, 0, 1);">#</span><span style="color: rgba(0, 128, 0, 1);">注销</span> <span style="color: rgba(0, 0, 255, 1);">return</span> HttpResponse(<span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">注销成功</span><span style="color: rgba(128, 0, 0, 1);">'</span>) |
is_authenticated()
用来判断当前请求是否通过了认证。
用法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<span style="color: rgba(0, 128, 0, 1);">#</span><span style="color: rgba(0, 128, 0, 1);"> 视图类中使用</span> <span style="color: rgba(0, 0, 255, 1);">def</span><span style="color: rgba(0, 0, 0, 1);"> auth_home(request): </span><span style="color: rgba(0, 128, 0, 1);">#</span><span style="color: rgba(0, 128, 0, 1);">在这直接可以拿到当前登录用户</span> <span style="color: rgba(0, 128, 0, 1);">#</span><span style="color: rgba(0, 128, 0, 1);"> 如果用户没登录,是匿名用户:AnonymousUser</span> <span style="color: rgba(0, 128, 0, 1);">#</span><span style="color: rgba(0, 128, 0, 1);"> 如果用户登录了(调用了login),可以直接拿到当前登录用户</span> <span style="color: rgba(0, 0, 255, 1);">print</span><span style="color: rgba(0, 0, 0, 1);">(request.user.username) </span><span style="color: rgba(0, 0, 255, 1);">print</span><span style="color: rgba(0, 0, 0, 1);">(request.user.id) </span><span style="color: rgba(0, 128, 0, 1);">#</span><span style="color: rgba(0, 128, 0, 1);">判断用户是否登录</span> <span style="color: rgba(0, 0, 255, 1);">if</span><span style="color: rgba(0, 0, 0, 1);"> request.user.is_authenticated: </span><span style="color: rgba(0, 0, 255, 1);">print</span>(<span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">用户登录了</span><span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(0, 0, 0, 1);">) </span><span style="color: rgba(0, 0, 255, 1);">else</span><span style="color: rgba(0, 0, 0, 1);">: </span><span style="color: rgba(0, 0, 255, 1);">print</span>(<span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">用户没有登录</span><span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(0, 0, 0, 1);">) </span><span style="color: rgba(0, 128, 0, 1);">#</span><span style="color: rgba(0, 128, 0, 1);">模板中使用</span> {% <span style="color: rgba(0, 0, 255, 1);">if</span> request.user.is_authenticated %<span style="color: rgba(0, 0, 0, 1);">} {{ request.user.username }} 欢迎你 {</span>% <span style="color: rgba(0, 0, 255, 1);">else</span> %<span style="color: rgba(0, 0, 0, 1);">} </span><a href=<span style="color: rgba(128, 0, 0, 1);">"</span><span style="color: rgba(128, 0, 0, 1);">/auth_login/</span><span style="color: rgba(128, 0, 0, 1);">"</span>>请去登录</a><span style="color: rgba(0, 0, 0, 1);"> {</span>% endif %} |
login_requierd()
auth 给我们提供的一个装饰器工具,用来快捷的给某个视图添加登录校验。
用法:
1 2 3 4 5 6 7 |
<span style="color: rgba(0, 0, 255, 1);">from</span> django.contrib.auth.decorators <span style="color: rgba(0, 0, 255, 1);">import</span><span style="color: rgba(0, 0, 0, 1);"> login_required @login_required(login_url</span>=<span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">/auth_login/</span><span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(0, 0, 0, 1);">) </span><span style="color: rgba(0, 128, 0, 1);">#</span><span style="color: rgba(0, 128, 0, 1);"> @login_required()</span> <span style="color: rgba(0, 0, 255, 1);">def</span><span style="color: rgba(0, 0, 0, 1);"> auth_order(request): </span><span style="color: rgba(0, 128, 0, 1);">#</span><span style="color: rgba(0, 128, 0, 1);"> 必须登录才能访问</span> <span style="color: rgba(0, 0, 255, 1);">return</span> HttpResponse(<span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">我是order,必须登录才看的</span><span style="color: rgba(128, 0, 0, 1);">'</span>) |
若用户没有登录,则会跳转到django默认的 登录URL ‘/accounts/login/ ‘ 并传递当前访问url的绝对路径 (登陆成功后,会重定向到该路径)。
如果需要自定义登录的URL,则需要在settings.py文件中通过LOGIN_URL进行修改。
示例:
1 |
LOGIN_URL = <span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">/login/</span><span style="color: rgba(128, 0, 0, 1);">'</span> <span style="color: rgba(0, 128, 0, 1);">#</span><span style="color: rgba(0, 128, 0, 1);"> 这里配置成你项目登录页面的路由</span> |
create_user()
auth 提供的一个创建新用户的方法,需要提供必要参数(username、password)等。
用法:
1 2 |
<span style="color: rgba(0, 0, 255, 1);">from</span> django.contrib.auth.models <span style="color: rgba(0, 0, 255, 1);">import</span><span style="color: rgba(0, 0, 0, 1);"> User user </span>= User.objects.create_user(username=<span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">用户名</span><span style="color: rgba(128, 0, 0, 1);">'</span>,password=<span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">密码</span><span style="color: rgba(128, 0, 0, 1);">'</span>,email=<span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">邮箱</span><span style="color: rgba(128, 0, 0, 1);">'</span>,...) |
create_superuser()
auth 提供的一个创建新的超级用户的方法,需要提供必要参数(username、password)等。
用法:
1 2 |
<span style="color: rgba(0, 0, 255, 1);">from</span> django.contrib.auth.models <span style="color: rgba(0, 0, 255, 1);">import</span><span style="color: rgba(0, 0, 0, 1);"> User user </span>= User.objects.create_superuser(username=<span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">用户名</span><span style="color: rgba(128, 0, 0, 1);">'</span>,password=<span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">密码</span><span style="color: rgba(128, 0, 0, 1);">'</span>,email=<span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">邮箱</span><span style="color: rgba(128, 0, 0, 1);">'</span>,...) |
check_password(password)
auth 提供的一个检查密码是否正确的方法,需要提供当前请求用户的密码。
密码正确返回True,否则返回False。
用法:
1 |
ok = user.check_password(<span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">密码</span><span style="color: rgba(128, 0, 0, 1);">'</span>) |
set_password(password)
auth 提供的一个修改密码的方法,接收 要设置的新密码 作为参数。
注意:设置完一定要调用用户对象的save方法!!!
用法:
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 |
request.user.set_password(password=<span style="color: rgba(128, 0, 0, 1);">''</span><span style="color: rgba(0, 0, 0, 1);">) request.user.save() @login_required </span><span style="color: rgba(0, 0, 255, 1);">def</span><span style="color: rgba(0, 0, 0, 1);"> set_password(request): user </span>=<span style="color: rgba(0, 0, 0, 1);"> request.user err_msg </span>= <span style="color: rgba(128, 0, 0, 1);">''</span> <span style="color: rgba(0, 0, 255, 1);">if</span> request.method == <span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">POST</span><span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(0, 0, 0, 1);">: old_password </span>= request.POST.get(<span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">old_password</span><span style="color: rgba(128, 0, 0, 1);">'</span>, <span style="color: rgba(128, 0, 0, 1);">''</span><span style="color: rgba(0, 0, 0, 1);">) new_password </span>= request.POST.get(<span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">new_password</span><span style="color: rgba(128, 0, 0, 1);">'</span>, <span style="color: rgba(128, 0, 0, 1);">''</span><span style="color: rgba(0, 0, 0, 1);">) repeat_password </span>= request.POST.get(<span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">repeat_password</span><span style="color: rgba(128, 0, 0, 1);">'</span>, <span style="color: rgba(128, 0, 0, 1);">''</span><span style="color: rgba(0, 0, 0, 1);">) </span><span style="color: rgba(0, 128, 0, 1);">#</span><span style="color: rgba(0, 128, 0, 1);"> 检查旧密码是否正确</span> <span style="color: rgba(0, 0, 255, 1);">if</span><span style="color: rgba(0, 0, 0, 1);"> request.user.check_password(old_password): </span><span style="color: rgba(0, 0, 255, 1);">if</span> <span style="color: rgba(0, 0, 255, 1);">not</span><span style="color: rgba(0, 0, 0, 1);"> new_password: err_msg </span>= <span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">新密码不能为空</span><span style="color: rgba(128, 0, 0, 1);">'</span> <span style="color: rgba(0, 0, 255, 1);">elif</span> new_password !=<span style="color: rgba(0, 0, 0, 1);"> repeat_password: err_msg </span>= <span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">两次密码不一致</span><span style="color: rgba(128, 0, 0, 1);">'</span> <span style="color: rgba(0, 0, 255, 1);">else</span><span style="color: rgba(0, 0, 0, 1);">: request.user.set_password(new_password) request.user.save() </span><span style="color: rgba(0, 0, 255, 1);">return</span> redirect(<span style="color: rgba(128, 0, 0, 1);">"</span><span style="color: rgba(128, 0, 0, 1);">/login/</span><span style="color: rgba(128, 0, 0, 1);">"</span><span style="color: rgba(0, 0, 0, 1);">) </span><span style="color: rgba(0, 0, 255, 1);">else</span><span style="color: rgba(0, 0, 0, 1);">: err_msg </span>= <span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">原密码输入错误</span><span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(0, 0, 0, 1);"> content </span>=<span style="color: rgba(0, 0, 0, 1);"> { </span><span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">err_msg</span><span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(0, 0, 0, 1);">: err_msg, } </span><span style="color: rgba(0, 0, 255, 1);">return</span> render(request, <span style="color: rgba(128, 0, 0, 1);">'</span><span style="color: rgba(128, 0, 0, 1);">set_password.html</span><span style="color: rgba(128, 0, 0, 1);">'</span>, content) |
3 User对象的属性
User对象属性:username, password
is_staff : 用户是否拥有网站的管理权限.
is_active : 是否允许用户登录, 设置为 False,可以在不删除用户的前提下禁止用户登录。
4 扩展默认的auth_user表
这内置的认证系统这么好用,但是auth_user表字段都是固定的那几个,我在项目中没法拿来直接使用啊!
比如,我想要加一个存储用户手机号的字段,怎么办?
聪明的你可能会想到新建另外一张表然后通过一对一和内置的auth_user表关联,这样虽然能满足要求但是有没有更好的实现方式呢?
答案是当然有了。
1 2 3 4 5 6 |
<span style="color: rgba(0, 128, 0, 1);">#</span><span style="color: rgba(0, 128, 0, 1);"> 第一种方案:创建一对一关联表</span> <span style="color: rgba(0, 0, 255, 1);">from</span> django.contrib.auth.models <span style="color: rgba(0, 0, 255, 1);">import</span><span style="color: rgba(0, 0, 0, 1);"> User </span><span style="color: rgba(0, 0, 255, 1);">class</span><span style="color: rgba(0, 0, 0, 1);"> user_detail(models.Model): user</span>=models.OneToOneField(to=<span style="color: rgba(0, 0, 0, 1);">User) phone</span>=models.CharField(max_length=32) |
我们还可以通过继承内置的 AbstractUser 类,来定义一个自己的Model类。
这样既能根据项目需求灵活的设计用户表,又能使用Django强大的认证系统了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<span style="color: rgba(0, 128, 0, 1);">#</span><span style="color: rgba(0, 128, 0, 1);"> 第二种方案,继承AbstractUser类来扩写</span> <span style="color: rgba(0, 0, 255, 1);">class</span><span style="color: rgba(0, 0, 0, 1);"> Meta: abstract </span>= True <span style="color: rgba(0, 128, 0, 1);">#</span><span style="color: rgba(0, 128, 0, 1);">这个表是个抽象表,只用来继承,不会在数据库生成表</span> <span style="color: rgba(0, 0, 0, 1);"> </span><span style="color: rgba(0, 128, 0, 1);">#</span><span style="color: rgba(0, 128, 0, 1);"> 使用步骤 </span> <span style="color: rgba(128, 0, 0, 1);">"""</span><span style="color: rgba(128, 0, 0, 1);"> 大前提是auth_user表没有创建之前干******* 写一个类,继承AbstractUser 在类中扩写字段(可以重写原来有的字段) </span><span style="color: rgba(128, 0, 0, 1);">"""</span> <span style="color: rgba(0, 0, 255, 1);">from</span> django.contrib.auth.models <span style="color: rgba(0, 0, 255, 1);">import</span><span style="color: rgba(0, 0, 0, 1);"> AbstractUser </span><span style="color: rgba(0, 0, 255, 1);">class</span><span style="color: rgba(0, 0, 0, 1);"> UserInfo(AbstractUser): username</span>=models.CharField(max_length=12<span style="color: rgba(0, 0, 0, 1);">) phone </span>= models.CharField(max_length=11, null=True, unique=<span style="color: rgba(0, 0, 0, 1);">True) </span><span style="color: rgba(0, 0, 255, 1);">def</span> <span style="color: rgba(128, 0, 128, 1);">__str__</span><span style="color: rgba(0, 0, 0, 1);">(self): </span><span style="color: rgba(0, 0, 255, 1);">return</span> self.username |
注意:
按上面的方案二扩展了内置的auth_user表之后,一定要在settings.py中告诉Django,我现在使用我新定义的UserInfo表来做用户认证。写法如下:
1 2 3 |
<span style="color: rgba(0, 128, 0, 1);">#</span><span style="color: rgba(0, 128, 0, 1);"> 在配置文件中配置*******</span><span style="color: rgba(0, 128, 0, 1);"> #</span><span style="color: rgba(0, 128, 0, 1);"> 引用Django自带的User表,继承使用时需要设置</span> AUTH_USER_MODEL = <span style="color: rgba(128, 0, 0, 1);">"</span><span style="color: rgba(128, 0, 0, 1);">app名.UserInfo</span><span style="color: rgba(128, 0, 0, 1);">"</span> |
再次注意:
一旦我们指定了新的认证系统所使用的表,我们就需要重新在数据库中创建该表,而不能继续使用原来默认的auth_user表了。
1 2 3 4 |
<span style="color: rgba(0, 128, 0, 1);">#</span><span style="color: rgba(0, 128, 0, 1);"> 如果auth_user表已经有了,还想扩写</span> -<span style="color: rgba(0, 0, 0, 1);">删库 </span>-<span style="color: rgba(0, 0, 0, 1);">清空项目中所有migration的记录 </span>-清空源码中admin,auth俩app的migration的记录 |
总代码
拓展:(融入了所有的auth方法,推荐联合使用)
1 基于auth继承AbstractUser类,加一个phone字段,实现用户的注册登录,登录成功,在home页面显示用户名,未登录,显示登录注册
2 实现修改密码功能 3 超级管理员能够禁用户登录
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 49 50 51 52 53 54 |
<span style="color: rgba(0, 0, 255, 1);"><!</span><span style="color: rgba(255, 0, 255, 1);">DOCTYPE html</span><span style="color: rgba(0, 0, 255, 1);">></span> <span style="color: rgba(0, 0, 255, 1);"><</span><span style="color: rgba(128, 0, 0, 1);">html </span><span style="color: rgba(255, 0, 0, 1);">lang</span><span style="color: rgba(0, 0, 255, 1);">="en"</span><span style="color: rgba(0, 0, 255, 1);">></span> <span style="color: rgba(0, 0, 255, 1);"><</span><span style="color: rgba(128, 0, 0, 1);">head</span><span style="color: rgba(0, 0, 255, 1);">></span> <span style="color: rgba(0, 0, 255, 1);"><</span><span style="color: rgba(128, 0, 0, 1);">meta </span><span style="color: rgba(255, 0, 0, 1);">charset</span><span style="color: rgba(0, 0, 255, 1);">="UTF-8"</span><span style="color: rgba(0, 0, 255, 1);">></span> <span style="color: rgba(0, 0, 255, 1);"><</span><span style="color: rgba(128, 0, 0, 1);">title</span><span style="color: rgba(0, 0, 255, 1);">></span>主页<span style="color: rgba(0, 0, 255, 1);"></</span><span style="color: rgba(128, 0, 0, 1);">title</span><span style="color: rgba(0, 0, 255, 1);">></span> <span style="color: rgba(0, 0, 255, 1);"><</span><span style="color: rgba(128, 0, 0, 1);">script </span><span style="color: rgba(255, 0, 0, 1);">src</span><span style="color: rgba(0, 0, 255, 1);">="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"</span><span style="color: rgba(0, 0, 255, 1);">></</span><span style="color: rgba(128, 0, 0, 1);">script</span><span style="color: rgba(0, 0, 255, 1);">></span> <span style="color: rgba(0, 0, 255, 1);"><</span><span style="color: rgba(128, 0, 0, 1);">link </span><span style="color: rgba(255, 0, 0, 1);">href</span><span style="color: rgba(0, 0, 255, 1);">="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"</span><span style="color: rgba(255, 0, 0, 1);"> rel</span><span style="color: rgba(0, 0, 255, 1);">="stylesheet"</span><span style="color: rgba(0, 0, 255, 1);">></span> <span style="color: rgba(0, 0, 255, 1);"><</span><span style="color: rgba(128, 0, 0, 1);">script </span><span style="color: rgba(255, 0, 0, 1);">src</span><span style="color: rgba(0, 0, 255, 1);">="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"</span><span style="color: rgba(0, 0, 255, 1);">></</span><span style="color: rgba(128, 0, 0, 1);">script</span><span style="color: rgba(0, 0, 255, 1);">></span> <span style="color: rgba(0, 0, 255, 1);"></</span><span style="color: rgba(128, 0, 0, 1);">head</span><span style="color: rgba(0, 0, 255, 1);">></span> <span style="color: rgba(0, 0, 255, 1);"><</span><span style="color: rgba(128, 0, 0, 1);">body</span><span style="color: rgba(0, 0, 255, 1);">></span> <span style="color: rgba(0, 0, 255, 1);"><</span><span style="color: rgba(128, 0, 0, 1);">nav </span><span style="color: rgba(255, 0, 0, 1);">class</span><span style="color: rgba(0, 0, 255, 1);">="navbar navbar-inverse"</span><span style="color: rgba(0, 0, 255, 1);">></span> <span style="color: rgba(0, 0, 255, 1);"><</span><span style="color: rgba(128, 0, 0, 1);">div </span><span style="color: rgba(255, 0, 0, 1);">class</span><span style="color: rgba(0, 0, 255, 1);">="container-fluid"</span><span style="color: rgba(0, 0, 255, 1);">></span> <span style="color: rgba(0, 128, 0, 1);"><!--</span><span style="color: rgba(0, 128, 0, 1);"> Brand and toggle get grouped for better mobile display </span><span style="color: rgba(0, 128, 0, 1);">--></span> <span style="color: rgba(0, 0, 255, 1);"><</span><span style="color: rgba(128, 0, 0, 1);">div </span><span style="color: rgba(255, 0, 0, 1);">class</span><span style="color: rgba(0, 0, 255, 1);">="navbar-header"</span><span style="color: rgba(0, 0, 255, 1);">></span> <span style="color: rgba(0, 0, 255, 1);"><</span><span style="color: rgba(128, 0, 0, 1);">button </span><span style="color: rgba(255, 0, 0, 1);">type</span><span style="color: rgba(0, 0, 255, 1);">="button"</span><span style="color: rgba(255, 0, 0, 1);"> class</span><span style="color: rgba(0, 0, 255, 1);">="navbar-toggle collapsed"</span><span style="color: rgba(255, 0, 0, 1);"> data-toggle</span><span style="color: rgba(0, 0, 255, 1);">="collapse"</span><span style="color: rgba(255, 0, 0, 1);"> data-target</span><span style="color: rgba(0, 0, 255, 1);">="#bs-example-navbar-collapse-1"</span><span style="color: rgba(255, 0, 0, 1);"> aria-expanded</span><span style="color: rgba(0, 0, 255, 1);">="false"</span><span style="color: rgba(0, 0, 255, 1);">></span> <span style="color: rgba(0, 0, 255, 1);"><</span><span style="color: rgba(128, 0, 0, 1);">span </span><span style="color: rgba(255, 0, 0, 1);">class</span><span style="color: rgba(0, 0, 255, 1);">="sr-only"</span><span style="color: rgba(0, 0, 255, 1);">></span>Toggle navigation<span style="color: rgba(0, 0, 255, 1);"></</span><span style="color: rgba(128, 0, 0, 1);">span</span><span style="color: rgba(0, 0, 255, 1);">></span> <span style="color: rgba(0, 0, 255, 1);"><</span><span style="color: rgba(128, 0, 0, 1);">span </span><span style="color: rgba(255, 0, 0, 1);">class</span><span style="color: rgba(0, 0, 255, 1);">="icon-bar"</span><span style="color: rgba(0, 0, 255, 1);">></</span><span style="color: rgba(128, 0, 0, 1);">span</span><span style="color: rgba(0, 0, 255, 1);">></span> <span style="color: rgba(0, 0, 255, 1);"><</span><span style="color: rgba(128, 0, 0, 1);">span </span><span style="color: rgba(255, 0, 0, 1);">class</span><span style="color: rgba(0, 0, 255, 1);">="icon-bar"</span><span style="color: rgba(0, 0, 255, 1);">></</span><span style="color: rgba(128, 0, 0, 1);">span</span><span style="color: rgba(0, 0, 255, 1);">></span> <span style="color: rgba(0, 0, 255, 1);"><</span><span style="color: rgba(128, 0, 0, 1);">span </span><span style="color: rgba(255, 0, 0, 1);">class</span><span style="color: rgba(0, 0, 255, 1);">="icon-bar"</span><span style="color: rgba(0, 0, 255, 1);">></</span><span style="color: rgba(128, 0, 0, 1);">span</span><span style="color: rgba(0, 0, 255, 1);">></span> <span style="color: rgba(0, 0, 255, 1);"></</span><span style="color: rgba(128, 0, 0, 1);">button</span><span style="color: rgba(0, 0, 255, 1);">></span> <span style="color: rgba(0, 0, 255, 1);"><</span><span style="color: rgba(128, 0, 0, 1);">a </span><span style="color: rgba(255, 0, 0, 1);">class</span><span style="color: rgba(0, 0, 255, 1);">="navbar-brand"</span><span style="color: rgba(255, 0, 0, 1);"> href</span><span style="color: rgba(0, 0, 255, 1);">="#"</span><span style="color: rgba(0, 0, 255, 1);">></span>用户管理系统<span style="color: rgba(0, 0, 255, 1);"></</span><span style="color: rgba(128, 0, 0, 1);">a</span><span style="color: rgba(0, 0, 255, 1);">></span> <span style="color: rgba(0, 0, 255, 1);"></</span><span style="color: rgba(128, 0, 0, 1);">div</span><span style="color: rgba(0, 0, 255, 1);">> <span style="color: rgba(0, 128, 0, 1);"><!--</span><span style="color: rgba(0, 128, 0, 1);"> Collect the nav links, forms, and other content for toggling </span><span style="color: rgba(0, 128, 0, 1);">--></span> <<span style="color: rgba(128, 0, 0, 1);">div </span><span style="color: rgba(255, 0, 0, 1);">class</span>="collapse navbar-collapse"<span style="color: rgba(255, 0, 0, 1);"> id</span>="bs-example-navbar-collapse-1"> <<span style="color: rgba(128, 0, 0, 1);">ul </span><span style="color: rgba(255, 0, 0, 1);">class</span>="nav navbar-nav"> <<span style="color: rgba(128, 0, 0, 1);">li </span><span style="color: rgba(255, 0, 0, 1);">class</span>="active"><<span style="color: rgba(128, 0, 0, 1);">a </span><span style="color: rgba(255, 0, 0, 1);">href</span>="/auth_superuser/">管理员注册<<span style="color: rgba(128, 0, 0, 1);">span </span><span style="color: rgba(255, 0, 0, 1);">class</span>="sr-only">(current)</<span style="color: rgba(128, 0, 0, 1);">span</span>></<span style="color: rgba(128, 0, 0, 1);">a</span>></<span style="color: rgba(128, 0, 0, 1);">li</span>> </<span style="color: rgba(128, 0, 0, 1);">ul</span>> <<span style="color: rgba(128, 0, 0, 1);">ul </span><span style="color: rgba(255, 0, 0, 1);">class</span>="nav navbar-nav"> <<span style="color: rgba(128, 0, 0, 1);">li </span><span style="color: rgba(255, 0, 0, 1);">class</span>="active"><<span style="color: rgba(128, 0, 0, 1);">a </span><span style="color: rgba(255, 0, 0, 1);">href</span>="/all_user/">管理员权限<<span style="color: rgba(128, 0, 0, 1);">span </span><span style="color: rgba(255, 0, 0, 1);">class</span>="sr-only">(current)</<span style="color: rgba(128, 0, 0, 1);">span</span>></<span style="color: rgba(128, 0, 0, 1);">a</span>></<span style="color: rgba(128, 0, 0, 1);">li</span>> </<span style="color: rgba(128, 0, 0, 1);">ul</span>> <<span style="color: rgba(128, 0, 0, 1);">ul </span><span style="color: rgba(255, 0, 0, 1);">class</span>="nav navbar-nav navbar-right"> <<span style="color: rgba(128, 0, 0, 1);">li</span>><<span style="color: rgba(128, 0, 0, 1);">a </span><span style="color: rgba(255, 0, 0, 1);">href</span>="#">欢迎</<span style="color: rgba(128, 0, 0, 1);">a</span>></<span style="color: rgba(128, 0, 0, 1);">li</span>> <<span style="color: rgba(128, 0, 0, 1);">li </span><span style="color: rgba(255, 0, 0, 1);">class</span>="dropdown"> <<span style="color: rgba(128, 0, 0, 1);">a </span><span style="color: rgba(255, 0, 0, 1);">href</span>="#"<span style="color: rgba(255, 0, 0, 1);"> class</span>="dropdown-toggle"<span style="color: rgba(255, 0, 0, 1);"> data-toggle</span>="dropdown"<span style="color: rgba(255, 0, 0, 1);"> role</span>="button"<span style="color: rgba(255, 0, 0, 1);"> aria-haspopup</span>="true"<span style="color: rgba(255, 0, 0, 1);"> aria-expanded</span>="false">登录设置<<span style="color: rgba(128, 0, 0, 1);">span </span><span style="color: rgba(255, 0, 0, 1);">class</span>="caret"></<span style="color: rgba(128, 0, 0, 1);">span</span>></<span style="color: rgba(128, 0, 0, 1);">a</span>> <<span style="color: rgba(128, 0, 0, 1);">ul </span><span style="color: rgba(255, 0, 0, 1);">class</span>="dropdown-menu"> <<span style="color: rgba(128, 0, 0, 1);">li</span>><<span style="color: rgba(128, 0, 0, 1);">a </span><span style="color: rgba(255, 0, 0, 1);">href</span>="/login/">登录</<span style="color: rgba(128, 0, 0, 1);">a</span>></<span style="color: rgba(128, 0, 0, 1);">li</span>> <<span style="color: rgba(128, 0, 0, 1);">li</span>><<span style="color: rgba(128, 0, 0, 1);">a </span><span style="color: rgba(255, 0, 0, 1);">href</span>="#">注册</<span style="color: rgba(128, 0, 0, 1);">a</span>></<span style="color: rgba(128, 0, 0, 1);">li</span>> <<span style="color: rgba(128, 0, 0, 1);">li</span>><<span style="color: rgba(128, 0, 0, 1);">a </span><span style="color: rgba(255, 0, 0, 1);">href</span>="#">切换用户</<span style="color: rgba(128, 0, 0, 1);">a</span>></<span style="color: rgba(128, 0, 0, 1);">li</span>> <<span style="color: rgba(128, 0, 0, 1);">li </span><span style="color: rgba(255, 0, 0, 1);">role</span>="separator"<span style="color: rgba(255, 0, 0, 1);"> class</span>="divider"></<span style="color: rgba(128, 0, 0, 1);">li</span>> <<span style="color: rgba(128, 0, 0, 1);">li</span>><<span style="color: rgba(128, 0, 0, 1);">a </span><span style="color: rgba(255, 0, 0, 1);">href</span>="#">退出登录</<span style="color: rgba(128, 0, 0, 1);">a</span>></<span style="color: rgba(128, 0, 0, 1);">li</span>> </<span style="color: rgba(128, 0, 0, 1);">ul</span>> </<span style="color: rgba(128, 0, 0, 1);">li</span>> </<span style="color: rgba(128, 0, 0, 1);">ul</span>> </<span style="color: rgba(128, 0, 0, 1);">div</span>><span style="color: rgba(0, 128, 0, 1);"><!--</span><span style="color: rgba(0, 128, 0, 1);"> /.navbar-collapse </span><span style="color: rgba(0, 128, 0, 1);">--></span> </<span style="color: rgba(128, 0, 0, 1);">div</span>><span style="color: rgba(0, 128, 0, 1);"><!--</span><span style="color: rgba(0, 128, 0, 1);"> /.container-fluid </span><span style="color: rgba(0, 128, 0, 1);">--></span> </<span style="color: rgba(128, 0, 0, 1);">nav</span>> <<span style="color: rgba(128, 0, 0, 1);">div </span><span style="color: rgba(255, 0, 0, 1);">class</span>="body"> <<span style="color: rgba(128, 0, 0, 1);">div </span><span style="color: rgba(255, 0, 0, 1);">class</span>="container-fluid"> <<span style="color: rgba(128, 0, 0, 1);">div </span><span style="color: rgba(255, 0, 0, 1);">class</span>="row"> <<span style="color: rgba(128, 0, 0, 1);">div </span><span style="color: rgba(255, 0, 0, 1);">class</span>="col-md-6"> <<span style="color: rgba(128, 0, 0, 1);">div </span><span style="color: rgba(255, 0, 0, 1);">class</span>="list-group"</span> </span> |
1 |