目录:Django 2.1 从零开始搭建博客网站系列
服务器环境搭建(选学)
- 在阿里云服务器从零开始上线Django项目:Ubuntu18.04+Python3+Django2,并通过公网IP访问
小试牛刀——简单的博客网站
- 一、Django2.1 搭建简单的博客网站
- 二、Django2.1 搭建简单的博客网站扩展——自定义模板和静态文件位置
庖丁解牛——多用户的博客网站之用户模块
- 三、Django2.1 搭建多用户的博客网站——登录
- 四、Django2.1 搭建多用户的博客网站——注册
- 五、Django2.1 搭建多用户的博客网站——修改密码
- 六、Django2.1 搭建多用户的博客网站——重置密码
- 七、Django2.1 搭建多用户的博客网站——维护个人详细信息
- 八、Django2.1 搭建多用户的博客网站——头像上传
- 九、Django2.1 搭建多用户的博客网站——用户模块小结
庖丁解牛——多用户的博客网站之文章模块
- 十、Django2.1 搭建多用户的博客网站——文章栏目
- 十一、Django2.1 搭建多用户的博客网站——简单的文章发布
- 十二、Django2.1 搭建多用户的博客网站——使用Markdown发布文章
- 十三、Django2.1 搭建多用户的博客网站——修改和删除文章
- 十四、Django2.1 搭建多用户的博客网站——向用户展示文章
- 十五、Django2.1 搭建多用户的博客网站——文章模块小结
华丽转身——多用户的博客网站之扩展功能
- 十六、Django2.1 搭建多用户的博客网站——文章点赞功能
- 十七、Django2.1 搭建多用户的博客网站——统计文章浏览次数
- 十八、Django2.1 搭建多用户的博客网站——文章评论功能
- 十九、Django2.1 搭建多用户的博客网站——使用自定义模板标签
- 二十、Django2.1 搭建多用户的博客网站——文章标签
- 二十一、Django2.1 搭建多用户的博客网站——美图模块
- 未完待续
项目源码下载:https://github.com/jt1024/lehehe
正文:
对于一个多用户的博客系统,管理员可以从后台直接登录,比如前文中的admin,拥有所有权限;非管理员用户最好是从前台登录,只拥有部分权限。
本文我们将实现这个非管理员用户的管理后台。
1、创建应用
python manage.py startapp account
修改 ./lehehe/settings.py 中的 INSTALLED_APPS
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
'account', # 新增
]
修改 ./lehehe/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('blog/', include('blog.urls')),
path('account/', include('account.urls')), # 新增
]
2、简单的登录
2.1 创建登录表单
新建 ./account/forms.py
from django import forms
class LoginForm(forms.Form):
username = forms.CharField()
password = forms.CharField(widget=forms.PasswordInput)
forms是什么?下面我们用 shell 来探索一下,执行下面代码进入 shell 模式
python manage.py shell
进入shell模式后再控制台执行下列代码
from account.forms import LoginForm
login_form = LoginForm()
print(login_form)
此时会输出:
由此可见,LoginForm其实就是登录表单的HTML代码
2.2 登录函数
编辑 ./account/views.py
from django.shortcuts import render
from django.http import HttpResponse
from django.contrib.auth import authenticate, login
from .forms import LoginForm
def user_login(request):
if request.method == "POST":
login_form = LoginForm(request.POST)
if login_form.is_valid():
cd = login_form.cleaned_data
user = authenticate(username=cd['username'], password=cd['password'])
if user:
login(request, user)
return HttpResponse("Welcome You. You have been authenticated successfully")
else:
return HttpResponse("Sorry. Your username or password is not right.")
else:
return HttpResponse("Invalid login")
if request.method == "GET":
login_form = LoginForm()
return render(request, "account/login.html", {"form": login_form})
- login_form.is_valid 在创建实例时,如果传递给表单的数据是符合表单类属性要求的,则返回True,否则返回False
- login_form.cleaned_data 以字典的形式返回实例的具体数据。如果传入的某项数据不合法,则在cleaned_data的结果中不予显示。
2.3 登录模板
新建 .templates/account/login.html
{% extends "base.html" %}
{% block title %}Login{% endblock %}
{% block content %}
Login
Input your username and password
{% endblock %}
{% csrf_token %} :使用POST的方法时,必须添加{% csrf_token %}标签,用于处理csrf安全机制
- {{ form.as_p }} :将表单的每个输入框包裹在一个
标签内 tags
- {{ form.as_table }} :将表单渲染成一个表格元素,每个输入框作为一个
标签 - {{ form.as_ul }} 将表单渲染成一个列表元素,每个输入框作为一个
- 标签
2.4 配置路由
新建 ./account/urls.py
from django.urls import path from . import views app_name = 'account' # 一定要写这一行,否则html中会报错 'account' is not a registered namespace urlpatterns = [ path(r'login/', views.user_login, name='user_login'), ]
2.5 测试
运行Django然后访问 http://127.0.0.1:8000/account/login/
填入 用户名:admin 密码:helloworld
2.6 修改登录模板样式
使用 {{ form.as_p }} 绘制表单,样式太普通,我们自定义表单样式。修改 .templates/account/login.html
{% extends "base.html" %} {% block title %}Login{% endblock %} {% block content %}
{% endblock %}Login
Input your username and password
此时再访问 http://127.0.0.1:8000/account/login/ 登录表单的样式已改变
3、使用Django内置的登录方法
修改 ./account/urls.py
from django.urls import path from . import views from django.contrib.auth import views as auth_views app_name = 'account' # 一定要写这一行,否则html中会报错 'account' is not a registered namespace urlpatterns = [ # path(r'login/', views.user_login, name='user_login'), path(r'login/', auth_views.LoginView.as_view(template_name="account/login.html"), name='user_login'), # 使用Django内置的登录方法 ]
在 ./lehehe/settings.py 的最后添加一行代码
LOGIN_REDIRECT_URL = '/blog/'
Django内置的登录方法 LoginView()函数里有一个参数redirect_field_name=LOGIN_REDIRECT_URL,这就是登录后的重定向设置,这行代码就是我们对这个参数的配置,登录后重定向到/blog/
完善通用模板头部,修改 ./templates/header.html
{% load staticfiles %}
4、使用Django内置的登出方法
在 ./account/urls.py 里添加一行代码
path(r'loginout/', auth_views.LogoutView.as_view(template_name="account/logout.html"), name='user_logout'), # 使用Django内置的登出方法
创建 ./templates/account/logut.html
{% extends "base.html" %} {% block title %}Logout{% endblock %} {% block content %}
{% endblock %}You have log out.
You can login again
完善通用模板头部,在 ./templates/header.html 中补充 Logout 的超链接
- Logout
5、测试登录、登出效果
登录成功页面登出页面