Django简单注册

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chengqiuming/article/details/85143498

一 用户注册思维导图

二 简单注册

1 增加一个注册用户的表单类mysite/account/forms.py

from django import forms
# 引入Django默认的用户模型User类,在这个表的类中就应用User模型,不需要
# 再新建用户数据模型了
from django.contrib.auth.models import User

# 如果提交表单互,不会对数据库进行修改,则继承Form类
class LoginForm(forms.Form):
    username = forms.CharField()
    password = forms.CharField(widget=forms.PasswordInput)

# 如果要将表单中的数据写入数据库表或者修改某些记录的值,就让表单继承ModelForm类
class RegistrationForm(forms.ModelForm):
    # 这两个属性是重新定义的,这里定义了就意味着覆盖或者不需要在内部类Meta中声明数据模型中的字段
    password = forms.CharField(label="Password", widget=forms.PasswordInput)
    password2 = forms.CharField(label="Confirm Pssword", widget=forms.PasswordInput)

    class Meta:
        # 声明表单类所应用的数据模型,也就是将来表单的内容会写入到哪个数据库表的哪些记录里面
        model = User
        # 表单类中的属性和数据模型类的属性一一对应
        # 有时我们不必在表单中向数据模型中的所有字段赋值
        # 可以用fields来说明所选用的属性
        fields = ("username", "email")

    # 检验用户所输入的两个密码是否一致,检查动作在调用is_valid()方法会被执行
    # 以clean_属性名称 命名方式所创建的方法,都有类似功能。
    def clean_password2(self):
        cd = self.cleaned_data
        if cd['password'] != cd['password2']:
            raise forms.ValidationError("passwords do not match.")
        return cd['password2']

2 编写注册的视图函数mysite/account/views.py

from django.shortcuts import render
from django.http import HttpResponse
# Django默认的用户认证和管理中的两个方法
from django.contrib.auth import authenticate, login
from .forms import LoginForm,RegistrationForm

# 用户登录视图函数
def user_login(request):
    # POST请求处理,里面绑定了数据
    if request.method == "POST":
        # 通过request.POST得到提交的表单数据,也是一个字典对象
        login_form = LoginForm(request.POST)
        # 验证传入的数据是否合法
        if login_form.is_valid():
            # 以健值对的形式记录了用户名和密码
            cd = login_form.cleaned_data
            # 验证用户名和密码
            user = authenticate(username=cd['username'], password=cd['password'])
            # 用户名和密码正确得到一个实例对象
            if user:
                # 用户登录操作,用户登录之后,Django会自动调用默认的session应用,将用户ID保存在session中,
                # 完成用户登录操作
                login(request,user)
                # 当网页返回字符串,用HttpResponse方法
                return HttpResponse("欢迎你,你已授权登录!")
            # 用户名和密码不对,得到空实例
            else:
                return HttpResponse("对不起,用户名和密码错误!")
        else:
            return HttpResponse("Invalid login")
    # GET请求处理,里面没有绑定数据
    if request.method == "GET":
        login_form = LoginForm()
        return render(request, "account/login.html", {"form":login_form})

def register(request):
   if request.method == "POST":
       user_form = RegistrationForm(request.POST)
       if user_form.is_valid():
           # 数据并没有保存到数据库,而仅生成一个数据对象,如果没有这个参数,将直接保存到数据库
           new_user = user_form.save(commit=False)
           # 设置数据对象的密码(这个密码是经过校验的)
           new_user.set_password(user_form.cleaned_data['password'])
           # 数据保存到数据库
           new_user.save()
           return HttpResponse("注册成功")
       else:
           return HttpResponse("对不起,你还没有注册")
   else:
       user_form = RegistrationForm()
       return render(request, "account/register.html", {"form": user_form})

3 新增模板mysite/templates/account/register.html

{% extends "base.html" %}
{% block title %}register user{% endblock %}
{% block content %}
<div class="row text-center vertical-middle-sm">
    <h1>注册</h1>
    <p>如果你是注册用户<strong><a href="{% url 'account:user_login' %}">登录</a></strong></p>
    <p>注册</p>
    <form class="form-horizontal" action="." method="post">{% csrf_token %}
        <div class="form-group">
            <label for="{{ form.username.id_for_label }}" class="col-md-5 control-label">用户名</label>
            <div class="col-md-6 text-left">{{ form.username }}</div>
        </div>
<div class="form-group">
            <label for="{{ form.email.id_for_label }}" class="col-md-5 control-label">邮箱</label>
            <div class="col-md-6 text-left">{{ form.email }}</div>
        </div>

        <div class="form-group">
            <label for="{{ form.password.id_for_label }}" class="col-md-5 control-label">密码</label>
            <div class="col-md-6 text-left">{{ form.password }}</div>
        </div>
        <div class="form-group">
            <label for="{{ form.password.id_for_label }}" class="col-md-5 control-label">确认密码</label>
            <div class="col-md-6 text-left">{{ form.password2 }}</div>
        </div>
        <input type="submit" class="btn btn-primary btn-lg" value="注册">
    </form>
</div>
{% endblock %}

4 添加URL mysite/account/urls.py

from django.conf.urls import url
from . import views
from django.contrib.auth import views as auth_views

urlpatterns = [
    # 自定义登录
    # url(r'^login/$', views.user_login, name='user_login'),
    # django内置的登录
    url(r"^login/$", auth_views.login, name="user_login"),
    url(r"^new-login/$", auth_views.login, {"template_name": "account/login.html"}),
    url(r'^logout/$', auth_views.logout, {"template_name": "account/logout.html"}, name='user_logout'),
    url(r'^register/$', views.register, name="user_register"),
]

三 测试结果

猜你喜欢

转载自blog.csdn.net/chengqiuming/article/details/85143498
今日推荐