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

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

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

用户注册时会用到 表单 来提交账号、密码等数据,所以需要写注册用的表单 /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'),
]
复制代码

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

查看所有标签

猜你喜欢:

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

The Haskell School of Music

The Haskell School of Music

Paul Hudak、Donya Quick / Cambridge University Press / 2018-10-4 / GBP 42.99

This book teaches functional programming through creative applications in music and sound synthesis. Readers will learn the Haskell programming language and explore numerous ways to create music and d......一起来看看 《The Haskell School of Music》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

URL 编码/解码
URL 编码/解码

URL 编码/解码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具