Django搭建个人博客:用户的注册

栏目: Python · 发布时间: 5年前

内容简介:用户注册时会用到上一章也讲过,对数据库进行操作的表单应该继承这里我们覆写了

用户注册时会用到 表单 来提交账号、密码等数据,所以需要写注册用的表单 /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/login.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 %}
<div class="container">
    <div class="row">
        <div class="col-12">
            <br>
            <form method="post" action=".">
                {% csrf_token %}
                <!-- 账号 -->
                <div class="form-group col-md-4">
                    <label for="username">昵称</label>
                    <input type="text" class="form-control" id="username" name="username" required>
                </div>
                <!-- 邮箱 -->
                <div class="form-group col-md-4">
                    <label for="email">Email</label>
                    <input type="text" class="form-control" id="email" name="email">
                </div>
                <!-- 密码 -->
                <div class="form-group col-md-4">
                    <label for="password">设置密码</label>
                    <input type="password" class="form-control" id="password" name="password" required>
                </div>
                <!-- 确认密码 -->
                <div class="form-group col-md-4">
                    <label for="password2">确认密码</label>
                    <input type="password" class="form-control" id="password2" name="password2" required>
                </div>
                <!-- 提交按钮 -->
                <button type="submit" class="btn btn-primary">提交</button>
            </form>
        </div>
    </div>
</div>
{% endblock content %}
复制代码

上面的模板文件中,我们在昵称、密码 input 标签中添加了 required 属性(前面提到过)。如果用户不填写带有 required 属性的字段,表单就不能提交,并提示用户填写。实际上前面学习的很多表单都可以添加 required 属性来提前验证数据的有效性。

注册的入口你可以放在任何喜欢的地方。本文放在登录页面中 /templates/userprofile/login.html

/templates/userprofile/login.html

...
<div class="col-12">
    <br>
    <h5>还没有账号?</h5>
    <h5>点击<a href='{% url "userprofile:register" %}'>注册账号</a>加入我们吧!</h5>
    <br>
    <form method="post" action=".">
        ...
    </form>
</div>

...
复制代码

最后就是在app中配置路由文件 /userprofile/urls.py 了:

/userprofile/urls.py

...

urlpatterns = [
    ...
    # 用户注册
    path('register/', views.user_register, name='register'),
]
复制代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

爆发

爆发

[美] 艾伯特-拉斯洛·巴拉巴西 / 马慧 / 中国人民大学出版社 / 2012-6 / 59.90元

1. 本书是一本超越《黑天鹅》的惊世之作。如果说塔勒布认为人类行为是随机的,都是小概率事件,是不可以预测的;那么全球复杂网络权威Barabasi则认为,人类行为93%是可以预测的。 2. Barabasi的研究是在人类生活数字化的大数据时代基础上进行的,移动电话、网络以及电子邮件使人类 行为变得更加容易量化,将我们的社会变成了一个巨大的数据库。他认为,人类正处在一个聚合点上,在这里数据、科学......一起来看看 《爆发》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具