基于form组件的注册

Posted liujie12

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于form组件的注册相关的知识,希望对你有一定的参考价值。

基于form组件的注册

urls.py

from django.contrib import admin
from django.urls import path

from blog import views
urlpatterns = [
    path(‘admin/‘, admin.site.urls),

    #注册
    path(‘register/‘, views.register),
    

]

views.py

#注册视图函数
def register(request):
    form_obj = forms.RegForm()
    if request.method == "POST":
        form_obj = forms.RegForm(request.POST)
        #帮我做校验
        if form_obj.is_valid():
            #校验通过,去数据库创建一个新的用户
            # 所以经过校验的数据都保存在  form_obj.cleaned_data  (一个大 字典 中)
            # print(form_obj.cleaned_data)    #{‘name‘: ‘某某某‘, ‘pwd‘: ‘1234567‘, ‘re_pwd‘: ‘1234567‘}
            del form_obj.cleaned_data["re_password"]  # 删除字典中的 re_pwd 因为数据库中没有这个属性
            models.UserInfo.objects.create_user(**form_obj.cleaned_data)
            return HttpResponse("注册成功!")
        else:
            print(form_obj.errors)
            return HttpResponse("出错啦!")


    return render(request, ‘register.html‘,{"form_obj":form_obj})

register.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>注册</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    {% load static %}
    <link rel="stylesheet" href="{% static ‘bootstrap/css/bootstrap.min.css‘ %}">
    <style>
        .container {
            margin-top: 100px;
        }
{#        头像图片#}
        #avatar_img {
            width: 80px;
            height: 50px;
        }
{#        隐藏选择图片的按钮#}
        #id_avatar {
            display: none;
        }
    </style>
</head>
<body>


<div class="container">
    <div class="row">
        <div class="col-md-offset-3 col-md-6">
            <form action="" method="post" class="form-horizontal" enctype="multipart/form-data">
                {% csrf_token %}
{#                用户名#}
                <div class="form-group {% if form_obj.username.error.0 %}has-error{% endif %}">
                    <label class="col-sm-2 control-label"
                           for="{{ form_obj.username.id_for_label }}">{{ form_obj.username.label }}</label>
                    <div class="col-sm-10">
                        {{ form_obj.username }}
                        <span class="help-block">{{ form_obj.username.error.0 }}</span>
                    </div>
                </div>
{#                密码#}
                <div class="form-group {% if form_obj.password.error.0 %}has-error{% endif %}">
                    <label class="col-sm-2 control-label"
                           for="{{ form_obj.password.id_for_label }}">{{ form_obj.password.label }}</label>
                    <div class="col-sm-10">
                        {{ form_obj.password }}
                        <span class="help-block">{{ form_obj.password.error.0 }}</span>
                    </div>
                </div>
{#                确认密码#}
                <div class="form-group {% if form_obj.re_password.error.0 %}has-error{% endif %}">
                    <label class="col-sm-2 control-label"
                           for="{{ form_obj.re_password.id_for_label }}">{{ form_obj.re_password.label }}</label>
                    <div class="col-sm-10">
                        {{ form_obj.re_password }}
                        <span class="help-block">{{ form_obj.re_password.error.0 }}</span>
                    </div>
                </div>
{#                邮箱#}
                <div class="form-group {% if form_obj.email.error.0 %}has-error{% endif %}">
                    <label class="col-sm-2 control-label"
                           for="{{ form_obj.email.id_for_label }}">{{ form_obj.email.label }}</label>
                    <div class="col-sm-10">
                        {{ form_obj.email }}
                        <span class="help-block">{{ form_obj.email.error.0 }}</span>
                    </div>
                </div>
{#                头像   因为在forms.py中没有这个input选项,只能自己写#}
                <div class="form-group">
                    <label class="col-sm-2 control-label">头像</label>
                    <div class="col-sm-10">
{#                        实现了点击图片相当于点击 选择头像按钮#}
                        <label for="id_avatar"><img id="avatar_img" src="/static/img/girl.png" alt=""></label>
                        <input type="file" name="avatar" id="id_avatar">
                    </div>
                </div>

                <div class="form-group">
                    <div class="col-sm-offset-2 col-sm-2">
                        <input type="submit" value="注册" class="btn btn-success">
                    </div>
                </div>
            </form>
        </div>
    </div>
</div>
<script src="{% static ‘jquery-3.2.1.min.js‘ %}"></script>
<script src="{% static ‘bootstrap/js/bootstrap.min.js‘ %}"></script>
</body>
</html>

自己写的forms.py

‘‘‘
BBS 用到的form类
‘‘‘

from django import forms

#定义一个注册的form类
class RegForm(forms.Form):
    username = forms.CharField(
        max_length=16,
        label="用户名",
        widget=forms.widgets.TextInput(
            attrs={"class": "form-control"}
        ),
        error_messages={
            "max_length":"用户名最长16位",
            "require":"用户名不能为空"
        }
    )
    password = forms.CharField(
        min_length=6,
        label="密码",
        error_messages={
            "min_length": "密码至少6位",
            "require": "密码不能为空"
        },
        widget=forms.widgets.PasswordInput(
            render_value=True,
            attrs={"class":"form-control"}
        )
    )
    re_password = forms.CharField(
        min_length=6,
        label="确认密码",
        error_messages={
            "require": "确认密码不能为空"
        },
        widget=forms.widgets.PasswordInput(
            render_value=True,
            attrs={"class": "form-control"}
        )
    )
    email = forms.EmailField(
        label="邮箱",
        error_messages={
            "require": "邮箱不能为空"
        },
        widget=forms.widgets.EmailInput(
            attrs={"class": "form-control"}
        )
    )

 以上注册功能已经实现的差不多了,但是在 选择头像 时,选择的头像不会替换默认的图片

改进方法如下(一个新的知识点):

#给选择图片的input标签绑定事件
<script>
    //找到头像的input标签,绑定change 事件
    $("#id_avatar").on("change",function () {
        //1.创建一个读文件的对象
        var filereader = new FileReader();
        //取到当前选中的头像文件
        console.log(this.files[0]);
        //读取你选中的文件
        filereader.readAsDataURL(this.files[0]);    //读文件是需要事件的(js是异步的)
        //实现等待功能
        filereader.onload = function () {
            //2.等上一步读完文件之后,把图片加载到img标签里面
            $("#avatar_img").attr("src",filereader.result);
        }


    })
</script>

 

以上是关于基于form组件的注册的主要内容,如果未能解决你的问题,请参考以下文章

Django基于form组件实现注册校验

jdango 项目试炼blog--基于Form组件ajax用户注册

Django - 基于forms组件和Ajax实现注册登录 - FileField字段 - Media配置

Form组件

用Django内置form组件实现注册

django—Form组件