[django] Form应用实例

forms.py

#!/usr/bin/env python 
# -*- coding:utf-8 -*-
from django.forms import Form,fields,widgets
from django.core.exceptions import ValidationError
from blog import models
from django.contrib.auth.models import User
from django.http import HttpRequest
from django.views import View


class LoginForm(Form):
    username = fields.CharField(
        min_length=2,
        max_length=16,
        required=True,
        label="用户名:",
        initial="test",
        widget=widgets.TextInput(
            attrs={"class": "form-control"}
        ),
        error_messages={
            "required": "不能为空",
            "invalid": "格式错误",
            "min_length": "用户名最短2位"
        }
    )

    password = fields.CharField(
        min_length=2,
        max_length=16,
        required=True,
        label="密码:",
        initial="123",
        widget=widgets.TextInput(
            attrs={"class": "form-control", "type": "password"}
        ),
        error_messages={
            "required": "不能为空",
            "invalid": "格式错误",
            "min_length": "密码最短2位"
        }
    )

class RegForm(Form):
    username = fields.CharField(
        min_length=2,
        max_length=16,
        required=True,
        label="用户名:",
        widget=widgets.TextInput(
            attrs={"class": "form-control"}
        ),
        error_messages={
            "required": "不能为空",
            "invalid": "格式错误",
            "min_length": "用户名最短2位"
        }
    )

    password = fields.CharField(
        min_length=2,
        max_length=16,
        required=True,
        label="密码:",
        widget=widgets.TextInput(
            attrs={"class": "form-control"}
        ),
        error_messages={
            "required": "不能为空",
            "invalid": "格式错误",
            "min_length": "密码最短2位"
        }
    )

    email = fields.EmailField(
        label="email:",
        widget=widgets.TextInput(
            attrs={"class": "form-control"}
        ),
        error_messages={
            "required": "不能为空",
            "invalid": "格式错误",
        }
    )

    def clean_username(self):
        reg_name = self.cleaned_data.get("username")
        if models.UserInfo.objects.filter(username=reg_name):
            self.add_error("username", ValidationError("用户名已存在"))
        else:
            return reg_name

    def clean_email(self):
        reg_email = self.cleaned_data.get("email")
        if models.UserInfo.objects.filter(email=reg_email):
            self.add_error("email", ValidationError("邮箱已注册"))
        else:
            return reg_email


class SetpwdForm(Form):

    old_password = fields.CharField(
        min_length=2,
        max_length=16,
        required=True,
        label="旧密码:",
        widget=widgets.TextInput(
            attrs={"class": "form-control"}
        ),
        error_messages={
            "required": "不能为空",
            "invalid": "格式错误",
            "min_length": "用户名最短2位"
        }
    )
    new_password = fields.CharField(
        min_length=2,
        max_length=16,
        required=True,
        label="新密码:",
        widget=widgets.TextInput(
            attrs={"class": "form-control"}
        ),
        error_messages={
            "required": "不能为空",
            "invalid": "格式错误",
            "min_length": "用户名最短2位"
        }
    )

    repeat_password = fields.CharField(
        min_length=2,
        max_length=16,
        required=True,
        label="重复密码:",
        widget=widgets.TextInput(
            attrs={"class": "form-control"}
        ),
        error_messages={
            "required": "不能为空",
            "invalid": "格式错误",
            "min_length": "用户名最短2位"
        }
    )

    def clean(self):
        pwd = self.cleaned_data.get("new_password")
        re_pwd = self.cleaned_data.get("repeat_password")
        if pwd != re_pwd:
            self.add_error("repeat_password", ValidationError("两次密码不一致"))
        else:
            return self.cleaned_data


class SetInfoForm(Form):
    email = fields.EmailField(
        label="email:",
        initial="",
        widget=widgets.TextInput(
            attrs={"class": "form-control"}
        ),
        error_messages={
            "required": "不能为空",
            "invalid": "格式错误",
        }
    )

    # pic = fields.ImageField(
    #     label="头像:",
    #     widget=widgets.FileInput(
    #         attrs={"class": "form-control"}
    #     ),
    #     error_messages={
    #         "required": "不能为空",
    #     }
    # )

views.py

def login(request):
    error_msg = ""

    if request.method == "GET":
        Form_obj = LoginForm()
        return render(request, "login.html", {"Form_obj": Form_obj})

    if request.method == "POST":
        Form_obj = LoginForm(request.POST)
        if Form_obj.is_valid():
            user = auth.authenticate(**Form_obj.cleaned_data)
            if user:
                auth.login(request, user)
                request.session["is_login"] = "1"
                return redirect('/index/')
            else:
                error_msg = "用户名或密码错误"
        return render(request,"login.html",{"error_msg": error_msg,"Form_obj": Form_obj})


def logout(request):
    auth.logout(request)
    return redirect('/login/')


def register(request):

    if request.method == "GET":
        reg_obj = RegForm()
        return render(request, "register.html", {"reg_obj": reg_obj})
    else:
        ret = {"status": 0, "msg": ""}
        reg_obj = RegForm(request.POST, request.FILES)
        if reg_obj.is_valid():
            # file = reg_obj.cleaned_data["pic"]
            # with open(f"pics/{file.name}", "wb") as f:
            #     for chunk in file.chunks():
            #         f.write(chunk)
            models.UserInfo.objects.create_user(**reg_obj.cleaned_data)
            ret["msg"] = "/index/"
            return JsonResponse(ret)
        else:
            ret["status"] = 1
            ret["msg"] = reg_obj.errors
            return JsonResponse(ret)
            # return render(request, "register.html", {"reg_obj": reg_obj, "error_msg": error_msg})

def check_username(request):
    ret = {"status": 0, "msg": ""}
    username = request.GET.get("username")
    if models.UserInfo.objects.filter(username=username):
        ret["status"] = 1
        ret["msg"] = "用户名已存在"
    return JsonResponse(ret)


@login_required
def change_pwd(request):
    if request.method == "GET":
        setpwd_obj = SetpwdForm()
        return render(request, "set_password.html", {"setpwd_obj": setpwd_obj})

    if request.method == "POST":
        error_msg = ""
        user = request.user
        setpwd_obj = SetpwdForm(request.POST)
        if setpwd_obj.is_valid():
            old_password = setpwd_obj.cleaned_data.get("old_password")
            new_password = setpwd_obj.cleaned_data.get("new_password")
            repeat_password = setpwd_obj.cleaned_data.get("repeat_password")
            if not user.check_password(old_password):
                error_msg = "旧密码错误"
            else:
                if new_password != repeat_password:
                    error_msg = "密码不一致"
                elif new_password == old_password:
                    error_msg = "新密码不能和旧密码重复"
                else:
                    user.set_password(repeat_password)
                    user.save()
                    return redirect("/login/")

        return render(request,"set_password.html", {"setpwd_obj": setpwd_obj, "error_msg": error_msg})

@login_required
def set_info(request):
    if request.method == "GET":
        SetInfo_obj = SetInfoForm()
        return render(request, "set_info.html", {"SetInfo_obj": SetInfo_obj})
    else:
        SetInfo_obj = SetInfoForm(request.POST)
        avatar_img = request.FILES.get("pic")
        if SetInfo_obj.is_valid():
            file_path = os.path.join(settings.MEDIA_ROOT, avatar_img.name)
            if os.path.exists(file_path):
                fix = datetime.now().strftime('%Y%m%d%H%M%S')
                file_path = os.path.join(settings.MEDIA_ROOT, fix + avatar_img.name)
            else:
                fix = ""
            with open(file_path, "wb") as f:
                for chunk in avatar_img.chunks():
                    f.write(chunk)

            models.UserInfo.objects.filter(username=request.user.username).update(**SetInfo_obj.cleaned_data, pic=(fix+avatar_img.name))
            return redirect("/index/")
        else:
            return render(request, "set_info.html", {"SetInfo_obj": SetInfo_obj})

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册</title>
    {% include "common/css.html" %}
</head>
<body>
{% include "common/navbar.html" %}

<div class="container">
    <div class="row">
        <div class="col-md-6 col-md-offset-3">
            <div class="panel panel-primary top-from">
                <div class="panel-heading">注册</div>
                <div class="panel-body">
                    <form action="/register/" method="post" novalidate autocomplete="off" class="form-horizontal" enctype="multipart/form-data">
                        {% csrf_token %}

                        {% for obj in reg_obj %}
                            {% if obj.name != "pic" %}
                                <div class="form-group">
                                <label for="{{ obj.id_for_label }}"
                                       class="col-sm-3 control-label">{{ obj.label }}</label>
                                <div class="col-sm-6">
                                    {{ obj }}
                                    <span class="help-block"> {{ obj.errors.0 }} </span>
                                </div>
                            </div>
                            {% endif %}
                        {% endfor %}

                        <div class="form-group">
                            <label class="col-sm-3 control-label">头像:</label>
                            <div class="col-sm-6">
                                <label for="id_pic">
                                <img class="pic" id="pic-img" src="/static/img/default.png" alt=""></label>
                                <input accept="image/*" style="display: none" type="file" name="pic" id="id_pic">
                                <span class="help-block"></span>

                            </div>
                        </div>

                        <div class="form-group">
                            <div class="col-sm-9 col-sm-offset-3">
                                <button type="button" class="btn btn-default" id="reg-submit">注册</button>
                                <span class="help-block"> {{ error_msg }} </span>
                            </div>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>

<script src="/static/jquery-3.4.1.min.js" ></script>
<script>
    {#头像绑定事件#}
    $("#id_pic").change(function () {
        {#创建一个读取文件对象#}
        var fileReader = new FileReader();
        {#取到该文件#}
        console.log(this.files[0]);
        {#读取该文件#}
        fileReader.readAsDataURL(this.files[0]);
        fileReader.onload = function(){
            {#文件读取完后加载到img标签#}
        $("#pic-img").attr("src",fileReader.result);
        };
    });
     {#// AJAX提交注册的数据#}
    $("#reg-submit").click(function () {

        var formData = new FormData();
        formData.append("username", $("#id_username").val());
        formData.append("password", $("#id_password").val());
        formData.append("email", $("#id_email").val());
        formData.append("pic", $("#id_pic")[0].files[0]);
        formData.append("csrfmiddlewaretoken", $("[name='csrfmiddlewaretoken']").val());

        $.ajax({
            url: "/register/",
            type: "post",
            {#ajax传文件加参数#}
            processData: false,
            contentType: false,
            data: formData,
            success:function (data) {
                if (data.status){
                    {# 有错误就展示错误#}
                    {#// console.log(data.msg);#}
                    {#// 将报错信息填写到页面上#}
                    $.each(data.msg, function (k,v) {
                        // console.log("id_"+k, v[0]);
                        // console.log($("#id_"+k));
                        $("#id_"+k).next("span").text(v[0]).parent().parent().addClass("has-error");
                    })

                }else {
                    location.href = data.msg;
                }
            }
        })
    });

    {#// 将所有的input框绑定获取焦点的事件,将所有的错误信息清空#}
    $("form input").focus(function () {
        $(this).next().text("").parent().parent().removeClass("has-error");
    });

    {#$("#id_username").blur(function () {#}
    $("#id_username").on("input", function () {
        var username = $(this).val();

        $.ajax({
            url: "/check_username/",
            type: "get",
            data: {"username": username},
            success: function(data){
                if (data.status){
                    $("#id_username").next().text(data.msg).parent().parent().addClass("has-error");
                }else{
                    $("#id_username").next().parent().parent().removeClass("has-error");
                }
            }
        })
    })

</script>
</body>
</html>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>修改个人信息</title>
    {% include "common/css.html" %}
</head>
<body>
{% include "common/navbar.html" %}

<div class="container">
    <div class="row">
        <div class="col-md-6 col-md-offset-3">
            <div class="panel panel-primary top-from">
                <div class="panel-heading">修改个人信息</div>
                <div class="panel-body">
                    <form action="/set_info/" method="post" novalidate autocomplete="off" class="form-horizontal" enctype="multipart/form-data">
                        {% csrf_token %}

                        {% for obj in SetInfo_obj %}
                            {% if obj.name != "pic" %}
                                <div class="form-group">
                                <label for="{{ obj.id_for_label }}"
                                       class="col-sm-3 control-label">{{ obj.label }}</label>
                                <div class="col-sm-6">
                                    {{ obj }}
                                    <span class="help-block"> {{ obj.errors.0 }} </span>
                                </div>
                            </div>
                            {% endif %}
                        {% endfor %}

                        <div class="form-group">
                            <label class="col-sm-3 control-label">头像:</label>
                            <div class="col-sm-6">
                                <label for="id_pic">
                                <img class="pic" id="pic-img" src="/media/{{ request.user.pic }}" alt="..."></label>
                                <input accept="image/*" value="/media/{{ request.user.pic }}" style="display: none" type="file" name="pic" id="id_pic">
                                <span class="help-block">{{ SetInfo_obj.errors.pic.0 }}</span>

                            </div>
                        </div>

                        <div class="form-group">
                            <div class="col-sm-9 col-sm-offset-3">
                                <button type="submit" class="btn btn-default" id="reg-submit">提交</button>
                                <span class="help-block"> {{ error_msg }} </span>
                            </div>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>


<script>
    $("#id_pic").change(function(){
        var fileReader = new FileReader();
        console.log(this.files[0]);
        fileReader.readAsDataURL(this.files[0]);
        fileReader.onload = function () {
            $("#pic-img").attr("src",fileReader.result);
        };
        });

</script>
</body>
</html>

set_info
set {% include "common/css.html" %}

{% include “common/navbar.html” %}

修改密码
        <form action="/change_pwd/" method="post" novalidate autocomplete="off" class="form-horizontal">
            {% csrf_token %}

            {% for obj in setpwd_obj %}
                <div class="form-group">
                    <label for="{{ obj.id_for_label }}"
                           class="col-sm-3 control-label">{{ obj.label }}</label>
                    <div class="col-sm-6">
                        {{ obj }}
                        <span class="help-block"> {{ obj.errors.0 }} </span>
                    </div>
                </div>
            {% endfor %}

            <div class="form-group">
                <div class="col-sm-offset-3 col-sm-6">
                    <button type="submit" class="btn btn-default">提交</button>
                    <span class="help-block"> {{ error_msg }} </span>
                </div>
            </div>
        </form>
            </div>
        </div>
    </div>
</div>

set_password



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Django中的表单可以使用Django自带的表单模块(forms)来创建。使用Django表单模块可以简化表单的创建和验证,同时也可以提供更好的数据安全性。 下面是使用Django表单模块创建表单的步骤: 1. 创建一个forms.py文件,并导入forms模块: ``` from django import forms ``` 2. 创建一个表单类,并继承自forms.Form类: ``` class MyForm(forms.Form): field1 = forms.CharField(label='Field1', max_length=100) field2 = forms.EmailField(label='Field2') ``` 3. 在视图函数中实例化表单类,并将其作为参数传递给模板: ``` from .forms import MyForm def my_view(request): form = MyForm() return render(request, 'my_template.html', {'form': form}) ``` 4. 在模板中渲染表单: ``` <form method="POST" action=""> {% csrf_token %} {{ form.as_p }} <button type="submit">Submit</button> </form> ``` 注意:form.as_p会将表单渲染成一个p标签。 5. 在视图函数中处理表单提交: ``` def my_view(request): if request.method == 'POST': form = MyForm(request.POST) if form.is_valid(): # 处理表单数据 field1 = form.cleaned_data['field1'] field2 = form.cleaned_data['field2'] # ... return redirect('success') else: form = MyForm() return render(request, 'my_template.html', {'form': form}) ``` 注意:使用form.is_valid()来验证表单是否有效,如果有效则可以使用form.cleaned_data来获取表单数据。 以上就是使用Django表单模块创建表单的基本步骤,更多详细信息可以查看Django官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Moke丶青

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值