用户注册及登陆功能(数据来源为数据库)
注册功能
在views.py中
from django.views.generic.edit import FormView
from users.models import UsersProfile
from django.urls import reverse, reverse_lazy
from users.users_forms import (
UserRegisterForm,UserRegisterFormView
)
#基本模版
class UserRegisterView(FormView):
template_name = '注册界面.html'
form_class = UserRegisterFormView #(UserRegisterForm 方式二,只是实现方法不同)
success_url = reverse_lazy('users:userslog')
# 数据有效,存库
def form_valid(self, form):
# 方式一
# from django.contrib.auth.hashers import make_password
# pwd_md5 = make_password(form.cleaned_data['password'])
# form.cleaned_data['password'] = pwd_md5
# UsersProfile.objects.create(**form.cleaned_data)
# 方式二
user = UsersProfile(**form.cleaned_data)
user.set_password(form.cleaned_data['password'])
user.save()
return super().form_valid(form)
# 数据无效返回原来的模板,并且携带原来提交的数据
def form_invalid(self, form):
return super().form_invalid(form)
新建一个users_forms.py文件
#方式一,二由于继承的父类不同决定的
import re
from django import forms
gender_choice = {
('1','男'),
('2','女'),
}
#方法二
class UserRegisterForm(forms.Form):
username = forms.CharField(
required = True,
widget = forms.TextInput(attrs={'class':'form-control'}),
)
password = forms.CharField(
required=True,
widget=forms.PasswordInput(attrs={'class':'form-control'}),
)
mobile = forms.CharField(
min_length=11,
max_length=11,
required=True,
widget=forms.TextInput(attrs={'class':'form-control'}),
)
age = forms.IntegerField(
required=True,
min_value=1,
max_value=200,
widget=forms.NumberInput(attrs={'class':'form-control'}),
)
gender = forms.ChoiceField(required=True,
choices=gender_choice,
widget=forms.RadioSelect(),
initial = 1
)
#单独验证需要的选项
def clean_mobile(self):
mobile = self.cleaned_data['mobile']
PRGEX_MOBILE = r'^1[358]\d{9}|^147\d{8}|^176\d{8}$'
regex = re.compile(PRGEX_MOBILE)
if regex.match(mobile):
return mobile
else:
raise forms.ValidationError(
'无效的手机号!',
code='mobile_invalid'
)
#方法一
from django import forms
from users.models import UsersProfile
class UserRegisterFormView(forms.ModelForm):
class Meta:
model = UsersProfile
fields = ['username', 'password', 'mobile','age',"gender"]
#自定义小部件,自己写的gender代替模版里的gender方法
widgets = {
'gender' : forms.RadioSelect()
}
#单独验证需要的选项
def clean_mobile(self):
mobile = self.cleaned_data['mobile']
PRGEX_MOBILE = r'^1[358]\d{9}|^147\d{8}|^176\d{8}$'
regex = re.compile(PRGEX_MOBILE)
if regex.match(mobile):
return mobile
else:
raise forms.ValidationError(
'无效的手机号!',
code='mobile_invalid'
)
在templates里建立注册页面
#需注意,UserRegisterFormView、注册页面、登陆页面的name必须一致
<div class="panel-body">
<form action="{% url 'users:usersreg' %}" method="POST">
{% csrf_token %}
<div class="form-group">
<label for="{{ form.username.id_for_label }}">用户名 </label>
<inputtype="text"name="username"class="formcontrol"placeholder="UserName">
{% if form.errors.username %}
<div class="alert alert-danger" role="alert">{{ form.errors.username.0 }}</div>
{% endif %}
</div>
#其他字段与上面的用户名相同
<div class="form-group">
{% for radio in form.gender %}
<label class="radio-inline" for="{{ radio.id_for_label }}">
{{ radio }}
</label>
{% endfor %}
</div>
<button type="submit" class="btn btn-default">注册</button>
</form>
</div>
登陆及登出功能以及页面设置功能
在views.py
# 指定一个用于接收到 GET 请求时,需要返回的模板文件,同时验证登陆的用户信息(来源为数据库)
class UserLoginView(LoginView):
template_name = '登陆界面.html'
class UserLogoutView(LogoutView):
# 用户退出登录后,将要跳转的 URL
next_page = reverse_lazy('users:usersbase')
在settings.py中
#登陆的同时将用户添加到session中,
from django.urls import reverse_lazy
# 用户登录成功后跳转的 URL
LOGIN_REDIRECT_URL = reverse_lazy("users:usersbase")
# 用户登录 GET 请求的 URL和登录验证失败后跳转到的 URL
LOGIN_URL = reverse_lazy("users:userslog")
在base.html中
{% if not request.user.is_authenticated %}
<li class="active"><a href="{% url 'users:userslog' %}">登陆</a></li>
<li class="active"><a href="{% url 'users:usersreg' %}">注册</a></li>
{% endif %}
#当登陆成功时,用户被添加到session中,因此request.user.is_authenticated不为空,所以,当登陆成功时,不会出现“登陆,注册”选项
登陆验证即为不登陆状态时,有些页面不予展示
#对于FBV,在views.py中
@login_required
def users_list(request):
pass
#该装饰器会使用LOGIN_URL中的url作为跳转链接
#对于CBV
from django.contrib.auth.mixins import LoginRequiredMixin
from django.urls import reverse_lazy
class DiskListView(LoginRequiredMixin,View):
login_url = reverse_lazy("users:userslog")
def get(self, request):
pass
#LoginRequiredMixin必须写在首位
网友评论