用户注册
I. 初始化一个Django App
命令行中cd到项目文件夹,然后:
>python manage.py startapp users
在setteings.py
中注册新的应用。在INSTALLED_APPS
列表中加入以下项:
'users.apps.UsersConfig',
在urls.py
中为新应用添加路径。添加如下代码:
from users import views as user_views
urlpatterns = [
path('register/', user_views.register, name='register'),
]
II. views.py
Django 的UserCreationForm
方法中有用户注册的初始化表单布局(但不包括提交按钮),无需自定义,这里将其赋给变量form
。render()
方法返回渲染后的HttpResponse对象并将表单变量传入register.html
。(在users --> templates --> users -->
下新建一个register.html
)
from django.shortcuts import render
from django.contrib.auth.forms import UserCreationForm
def register(request):
form = UserCreationForm()
return render(request, 'users/register.html', {'form': form})
III. register.html
- 同样继承
base.html
的布局。 - 两种最常用的 HTTP 方法:GET 和 POST。GET - 从指定的资源请求数据。POST - 向指定的资源提交要被处理的数据。这里要向服务器提交用户注册信息,因此要用到POST方法。
- 在用到了POST方法的form表单的html模板中需要在
<form>
元素中添加csrf_token
:
Django文档对CSRF的解释:<form method="post">{% csrf_token %}
Cross Site Request Forgery protection
The CSRF middleware and template tag provides easy-to-use protection against Cross Site Request Forgeries.
register.html
:
{% extends "blog/base.html" %}
{% block content %}
<div class="content-section">
<form method="POST">
{% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom ml-0">Join Today !</legend>
{{ form }}
</fieldset>
<div class="form-group">
<button class="btn btn-outline-info" type="submit">Sign Up</button>
</div>
</form>
<div class="border-top pt-3">
<small class="text-muted">
已经有一个账号了?<a class="ml-2" href="#">Sign In</a>
</small>
</div>
</div>
{% endblock content %}
为了美化样式,可将{{ form }}
修改为{{ form.as_p }}
,意为将表单分段显示;或者使用crsipy包,在后面会介绍。
IV. 添加注册成功的页面响应
views.py
中,
-
添加代码,使收到了
POST
方法的request时,将数据通过UserCreationForm()
方法存入变量form,否则使 form为空。 -
如果输入数据有效,则通过
cleaned_data_get()
方法获取用户名(在注册成功通知时引用)。 -
导入Django的
messages
框架,使用messages.sucess
方法发送消息。
常用的messsages方法如下:messages.debug(request, '%s SQL statements were executed.' % count) messages.info(request, 'Three credits remain in your account.') messages.success(request, 'Profile details updated.') messages.warning(request, 'Your account expires in three days.') messages.error(request, 'Document deleted.')
Message tags有五种:debug, info, success, warning, error。
-
导入Django的
redirect
模块,在注册成功后通过redirect()
方法转到blog-home
页面。
base.html
中为注册成功消息添加布局:如果messages变量非空,则依次显示每条消息。通过引用messages.tags
决定alert 的bootstrap样式。
代码如下:views.py
:
from django.shortcuts import render, redirect
from django.contrib.auth.forms import UserCreationForm
from django.contrib import messages
def register(request):
if request.method == 'POST':
form = UserCreationForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
messages.success(request, f'Account created for { username } !')
return redirect('blog-home')
else:
form = UserCreationForm()
return render(request, 'users/register.html', {'form': form})
base.html
:
<div class="col-md-8">
{% if messages %}
{% for message in messages %}
<div class="alert alert-{{ message.tags }}">
{{ message }}
</div>
{% endfor %}
{% endif %}
{% block content %}{% endblock %}
</div>
V. 保存新用户到服务器
如果用户提交表单有效,则执行form.save()
views.py
中改动后代码片段如下:
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
messages.success(request, f'Account created for { username } !')
return redirect('blog-home')
VI. 在注册表单中新建邮箱域
此后,新用户注册后可被保存到服务器,在admin页面中可以查看到。
但其缺少Email信息,因为默认的UserCreationForm()
方法中不包含EmailField
,可通过自定义一个继承了UserCreationForm
方法的新方法,并在此基础上加入EmailField
。
- 在user目录下新建
forms.py
文件 - 导入Django的
forms
、User
、UserCreationForm
框架 - 定义类
UserRegisterForm
,继承UserCreationForm
方法,并定义类Meta
, 这里也不是很懂,待解决。 - 在
views.py
中导入UserRegisterForm
方法并用此方法替换UserCreationForm
。
代码如下:forms.py
:
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
class UserRegisterForm(UserCreationForm)
email = forms.EmailField()
class Meta:
model = User
fields = ['username','email','password1','password2']
views.py
:
from django.shortcuts import render, redirect
from django.contrib import messages
from .forms import UserRegisterForm
def register(request):
if request.method == 'POST':
form = UserRegisterForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
messages.success(request, f'Account created for { username } !')
return redirect('blog-home')
else:
form = UserRegisterForm()
return render(request, 'users/register.html', {'form': form})
VII. 用免费的第三方Django应用crispy美化注册界面
-
下载crispy包:
pip install django-crispy-forms
。 -
在
settings.py
中:INSTALLED_APPS中添加'crispy_forms'
项;并在文件最后添加:CRISPY_TEMPLATE_PACK = 'bootstrap4'
使crispy使用Bootsrap4的风格(默认为Bootsrap2)。
-
在
register.html
中,{% load crispy_forms_tags %}
, 并使用crispy过滤注册界面表单:{{ form|crispy }}
register.html
最终代码:
{% extends "blog/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
<div class="content-section">
<form method="POST">
{% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom ml-0">Join Today !</legend>
{{ form|crispy }}
</fieldset>
<div class="form-group">
<button class="btn btn-outline-info" type="submit">Sign Up</button>
</div>
</form>
<div class="border-top pt-3">
<small class="text-muted">
已经有一个账号了?<a class="ml-2" href="#">Sign In</a>
</small>
</div>
</div>
{% endblock content %}
来源:CSDN
作者:AAAA级风景区
链接:https://blog.csdn.net/weixin_43072901/article/details/103975036