文章目录
往期回顾
创建用户账户
建立一个用户注册和身份证系统,让用户能够注册账户,进而登录和注销。
应用程序 users
用 startapp 创建一个名为users的应用程序
python
# 控制台中打开虚拟环境
ll_env\Scripts\activate
# 创建users应用程序
python manage.py startapp users
#查看创建后项目状态
dir
#查看user结构
dir users
将 users 应用程序添加到项目中
打开settings.py文件,在 INSTALLED_APPS 处进行添加。
python
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 添加自己的模型
'learning_logs',
'users',
]
users 的 URL
修改项目根部目录的urls.py,使其包含users的URL
python
urlpatterns = [
path('admin/', admin.site.urls),
path(r'^users/', include(('users.urls', 'users'), namespace='users')),
path(r'', include(('learning_logs.urls', 'learning_logs'), namespace='learning_logs')),
]
登录页面
user应用程序下新建 urls.py
python
from django.urls import re_path
from django.contrib.auth.views import LoginView
from . import views
urlpatterns =[
#登录页面
re_path(r'^login/$', LoginView.as_view(template_name='users/login.html'), name='login'),
]
模板login.html
用户请求登录页面时,Django将使用默认视图 login,但我们依然需要为这个页面提供模板。为此,在目录learning_log/users/中,创建一个名为 templates 的目录,并在该目录下创建一个名为 users的目录。
python
{% extends "learning_logs/base.html" %}
{% block content %}
{% if form.errors %}
<p>Your usersname and password didn't match, Please try again.</p>
{% endif %}
<form method="post" action="{% url 'users:login' %}">
{% csrf_token %}
{{ form.as_p }}
<button name="submit">log in</button>
<input type="hidden" name="text" value="{% url 'learning_logs:index' %}" />
</form>
{% endblock content %}
链接到登录页面
base.html 中添加到登录页面的链接,让所有页面都包含它。
python
<p>
<a href="{% url 'learning_logs:index' %}">Learning Log</a> -
<a href="{% url 'learning_logs:topics' %}">Topics</a> -
{% if user.is_authenticated %}
Hello, {{ user.username }}.
{% else %}
<a href="{% url 'users:login' %}">log in</a>
{% endif %}
</p>
{% block content %}{% endblock content %}
效果预览
注销
现在需要给用户提供一个注销的页面,我们不创建用于注销的页面,而是让用户只需点击一个链接就能注销并返回到主页。
注销URL
python
# 注销
re_path(r'^logout/$', views.logout_view, name='logout'),
视图函数
python
from django.shortcuts import render
from django.http import HttpResponseRedirect
from django.urls import reverse
from django.contrib.auth import logout
# 注销用户
def logout_view(request):
logout(request)
return HttpResponseRedirect(reverse('learning_logs:index'))
链接到注销视图
python
<p>
<a href="{% url 'learning_logs:index' %}">Learning Log</a> -
<a href="{% url 'learning_logs:topics' %}">Topics</a> -
{% if user.is_authenticated %}
Hello, {{ user.username }}.
<a href="{% url 'users:logout' %}">log out</a>
{% else %}
<a href="{% url 'users:login' %}">log in</a>
{% endif %}
</p>
{% block content %}{% endblock content %}
效果预览
注册页面
创建让新用户可以注册的页面,我们使用Django提供的表单UserCreationForm,但编写自己的视图函数和模板
注册页面的URL
python
# 注册
re_path(r"^register/$", views.register, name='register'),
视图函数
python
from django.shortcuts import render
from django.http import HttpResponseRedirect
from django.urls import reverse
from django.contrib.auth import logout, login, authenticate
from django.contrib.auth.forms import UserCreationForm
# 注册新用户
def register(request):
if request.method != 'POST':
# 显示空的注册表单
form = UserCreationForm()
else:
# 处理写好的表单
form = UserCreationForm(data=request.POST)
if form.is_valid():
new_user = form.save()
# 让用户自动登录,再重定向到主页
authenticate_user = authenticate(username=new_user.username, password=request.POST['password1'])
login(request, authenticate_user)
return HttpResponseRedirect(reverse('learning_logs:index'))
context = {'form': form}
return render(request, 'users/register.html', context)
注册模板
register.html 存储在login.html所在目录
python
{% extends "learning_logs/base.html" %}
{% block content %}
<form method="post" action="{% url 'users:register' %}">
{% csrf_token %}
{{ form.as_p }}
<button name="submit">register</button>
<input type="hidden" name="next" value="{% url 'learning_logs:index' %}"/>
</form>
{% endblock content %}
链接到登录页面
python
<p>
<a href="{% url 'learning_logs:index' %}">Learning Log</a> -
<a href="{% url 'learning_logs:topics' %}">Topics</a> -
{% if user.is_authenticated %}
Hello, {{ user.username }}.
<a href="{% url 'users:logout' %}">log out</a>
{% else %}
<a href="{% url 'users:register' %}">register</a>
<a href="{% url 'users:login' %}">log in</a>
{% endif %}
</p>
{% block content %}{% endblock content %}