摘要:既然有登录登出,那么用户的注册肯定也是少不了的。用户在注册成功后会自动登录并返回博客列表页面。总结本章用到了表单类对数据进行验证清洗等知识,完成了用户的注册功能。
既然有登录登出,那么用户的注册肯定也是少不了的。
注册表单类用户注册时会用到表单来提交账号、密码等数据,所以需要写注册用的表单/userprofile/forms.py:
/userprofile/forms.py ... # 注册用户表单 class UserRegisterForm(forms.ModelForm): # 复写 User 的密码 password = forms.CharField() password2 = forms.CharField() class Meta: model = User fields = ("username", "email") # 对两次输入的密码是否一致进行检查 def clean_password2(self): data = self.cleaned_data if data.get("password") == data.get("password2"): return data.get("password") else: raise forms.ValidationError("密码输入不一致,请重试。")
上一章也讲过,对数据库进行操作的表单应该继承forms.ModelForm,可以自动生成模型中已有的字段。
这里我们覆写了password字段,因为通常在注册时需要重复输入password来确保用户没有将密码输入错误,所以覆写掉它以便我们自己进行数据的验证工作。def clean_password2()中的内容便是在验证密码是否一致了。def clean_[字段]这种写法Django会自动调用,来对单个字段的数据进行验证清洗。
覆写某字段之后,内部类class Meta中的定义对这个字段就没有效果了,所以fields不用包含password。
需要注意:
验证密码一致性方法不能写def clean_password(),因为如果你不定义def clean_password2()方法,会导致password2中的数据被Django判定为无效数据从而清洗掉,从而password2属性不存在。最终导致两次密码输入始终会不一致,并且很难判断出错误原因。
从POST中取值用的data.get("password")是一种稳妥的写法,即使用户没有输入密码也不会导致程序错误而跳出。前面章节提取POST数据我们用了data["password"],这种取值方式如果data中不包含password,Django会报错。另一种防止用户不输入密码就提交的方式是在表单中插入required属性,后面会讲到。
视图函数编写注册的视图/userprofile/views.py:
/userprofile/views.py # 引入 UserRegisterForm 表单类 from .forms import UserLoginForm, UserRegisterForm # 用户注册 def user_register(request): if request.method == "POST": user_register_form = UserRegisterForm(data=request.POST) if user_register_form.is_valid(): new_user = user_register_form.save(commit=False) # 设置密码 new_user.set_password(user_register_form.cleaned_data["password"]) new_user.save() # 保存好数据后立即登录并返回博客列表页面 login(request, new_user) return redirect("article:article_list") else: return HttpResponse("注册表单输入有误。请重新输入~") elif request.method == "GET": user_register_form = UserRegisterForm() context = { "form": user_register_form } return render(request, "userprofile/register.html", context) else: return HttpResponse("请使用GET或POST请求数据")
逻辑上结合了发表文章视图和用户登录视图,没有新的知识。
用户在注册成功后会自动登录并返回博客列表页面。
模板和url表单有关的模板文件我们也很熟悉了,新建/templates/userprofile/register.html:
/templates/userprofile/register.html {% extends "base.html" %} {% load staticfiles %} {% block title %} 登录 {% endblock title %} {% block content %}{% endblock content %}
上面的模板文件中,我们在昵称、密码input 标签中添加了required属性(前面提到过)。如果用户不填写带有required属性的字段,表单就不能提交,并提示用户填写。实际上前面学习的很多表单都可以添加required属性来提前验证数据的有效性。
注册的入口你可以放在任何喜欢的地方。本文放在登录页面中/templates/userprofile/login.html:
/templates/userprofile/login.html ... ...
最后就是在app中配置路由文件/userprofile/urls.py了:
/userprofile/urls.py ... urlpatterns = [ ... # 用户注册 path("register/", views.user_register, name="register"), ]测试
运行服务器,进入到登录页面,多了注册的提示:
点击注册账号进入注册页面:
填写好表单后提交(Email地址是可以为空的):
成功登录并返回了博客列表,功能完成。
总结本章用到了表单类、对数据进行验证清洗等知识,完成了用户的注册功能。
接下来学习如何实现删除已有的用户。
有疑问请在杜赛的个人网站留言,我会尽快回复。
或Email私信我:dusaiphoto@foxmail.com
项目完整代码:Django_blog_tutorial
转载请告知作者并注明出处。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/44920.html
摘要:比较流行的解决方案是允许用户通过第三方登录,即可以通过微博这类知名社区的授权,从而登录你的小站,免去了注册的麻烦。微博微信的登录方式大致都遵循这个流程本章虽然加载了微博的接口,但是限于篇幅并没有配置,请读者查阅官方文档去实现。 现在我们已经拥有一个可以进行用户本地登录的博客系统了。如果有人欣赏你的文章,说不定就会注册成为本地用户,并和你好好交流一番。 但头疼的是,用户可能每天都在互联网...
摘要:比如,在一个博客应用中,你可能会创建如下几个视图博客首页展示最近的几项内容。这些需求都靠视图来完成。首先写一个最简单的视图函数,在浏览器中打印出字符串。调用函数时会返回一个含字符串的对象。换句话说,的作用是将映射到视图中。 Django 中的视图的概念是「一类具有相同功能和模板的网页的集合」。比如,在一个博客应用中,你可能会创建如下几个视图: 博客首页:展示最近的几项内容。 内容详情...
摘要:接下来你就可以在项目的任何地方发送通知了像这样其中的参数释义发送通知的对象接收通知的对象动词短语链接到动作的对象可选执行通知的对象可选有点绕,举个栗子杜赛在搭建个人博客中对你发表了评论。有疑问请在杜赛的个人网站留言,我会尽快回复。 凭借你勤奋的写作,拜读你文章的用户越来越多,他们的评论也分散在众多的文章之中。作为博主,读者的留言肯定是要都看的;而读者给你留言,自然也希望得到回复。 怎么...
摘要:创建在中的一个代表一个功能模块。就是项目的基石,因此开发博客的第一步就是创建新的,用来实现跟文章相关的功能模块。注意之后,的必须配置,否则会报错。总结本章创建了博客文章功能的,学习了注册并配置。 创建APP 在Django中的一个app代表一个功能模块。开发者可以将不同功能的模块放在不同的app中, 方便代码的复用。app就是项目的基石,因此开发博客的第一步就是创建新的app,用来实现...
摘要:确认创建成功后,记得在中注册因为我们想显示发表评论的时间,修改时区设置为上海的时区。处理错误请求发表评论仅接受请求。返回到一个适当的中即用户发送评论后,重新定向到文章详情页面。总结本章实现了发表评论展示评论的功能。 在没有互联网的年代,我们用日记来记录每天的心得体会。小的时候我有一个带锁的日记本,生怕被别人看见里面写了啥,钥匙藏得那叫一个绝。 现在时代变了,网络版的日记本:博客,却巴不...
阅读 1310·2021-11-22 14:44
阅读 2445·2021-09-30 09:47
阅读 1221·2021-09-09 11:56
阅读 2076·2021-09-08 09:45
阅读 3953·2021-08-31 09:40
阅读 1250·2019-08-30 15:52
阅读 2044·2019-08-30 14:09
阅读 1578·2019-08-26 17:04