Form使用AJax提交

from django.core.exceptions import ValidationError
class AjaxForm(forms.Form):
    username = fields.CharField()
    user_id = fields.IntegerField(
            widget=widgets.Select(choices=[(1,'zhangyang'),(2,"yangfan"),])
    )
    def clean_username(self):
        v=self.cleaned_data['username']
        if models.UserInfo.objects.filter(username=v).count():
            #整体错了,详细的错误信息
            raise ValidationError("用户名已存在")
        else:
            return v
    def clean(self):
        value_dict=self.cleaned_data
        v1=value_dict.get("username")
        v2=value_dict.get("user_id")
        if v1 == "root" and v2==1:
            raise ValidationError("整体错误信息")
        return self.cleaned_data

def ajax(request):
    if request.method=="GET":
        obj=AjaxForm()#没有做验证,只显示HTML标签
        return render(request,"ajax.html",{'obj':obj})
    else:
        obj=AjaxForm(request.POST)#也没有做验证
        if obj.is_valid():#做验证
            print(obj.cleaned_data)
            return JsonResponse({'status':200,'msg':'success'})
        else:
            print(obj.errors)
            return JsonResponse({'status':201,'msg':obj.errors})
<form action="" id="fm">
    <div class='errors'></div>
    {% for item in obj_list %}
         <div>{{item}}{{item.errors.0}}</div>
    {% endfor%}
<input type="button" value="提交"id="ajax_sub">
</form>
<script>
    $("#ajax_sub").click(function () {
        $.ajax({
            url:'/ajax/',
            type:"post",
            data:$("#fm").serialize(),
            dataType:'json',
            success:function (arg) {
                console.log(arg);
                $(".errors").text(arg.non_field_errors)
            }
        })
    })

as_p、as_ul、as_table后台通过form在前端的input相关标签展示

clean验证的,前端拿到error:non_field_errors

 

小项目:实现增删改查,用AJax实现

<!DOCTYPE html>
{% load static %}
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="{% static 'js/jquery-3.3.1.js' %}"></script>
    <script src="{% static 'plugin/bootstrap.3.0.0/content/Scripts/bootstrap.min.js' %}"></script>
    <link rel="stylesheet" href="{% static 'plugin/bootstrap.3.0.0/content/Content/bootstrap.min.css' %}">
    <link rel="stylesheet" href="{% static 'plugin/font-awesome-4.7.0/css/font-awesome.min.css' %}">
    <style>
        .a-margin{
            margin: 0 5px;
        }
    </style>
</head>
<body>
<div>
    <select name="" id="sel" multiple>
        <option value="1">1</option>
        <option value="2">2</option>
        <option value="3">3</option>
        <option value="4">4</option>
        <option value="5">5</option>
    </select>
    <input type="button" value="btn" onclick="testAjax();">
</div>
<div class="container">
    <div style="padding: 20px 0;">
        <input type="button" value="添加" class="btn btn-primary" onclick="addStudent();">
        <input type="button" class="btn btn-danger" value="删除">
    </div>
    <div>
        <table class="table table-hover table-striped">
            <thead>
            <tr>
                <th>ID</th>
                <th>姓名</th>
                <th>年龄</th>
                <th>性别</th>
                <th>班级</th>
                <th>操作</th>
            </tr>
            </thead>
            <tbody id="tb">
            {% for stu in stu_list %}
                <tr nid="{{ stu.id }}">
                    <td na="pid">{{ stu.id }}</td>
                    <td na="username">{{ stu.name }}</td>
                    <td na="age">{{ stu.age }}</td>
                    <td na="gender">{{ stu.gender }}</td>
                    <td na="csname" cid="{{ stu.cs_id }}">{{ stu.cs.name }}</td>
                    <td>
                        <a class="fa fa-remove fa-2x del-row a-margin"></a>
                        <a class="fa fa-pencil-square-o fa-2x edit-row a-margin"></a>
                    </td>
                </tr>
            {% endfor %}

            </tbody>
        </table>
    </div>
</div>

<!-- Modal--添加 -->
<div class="modal fade" id="addModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
    <div class="modal-dialog" role="document">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span>
                </button>
                <h4 class="modal-title" id="myModalLabel">添加学生数据</h4>
            </div>
            <div class="modal-body">
                <form class="form-horizontal">
                    <div class="form-group">
                        <label for="username" class="col-sm-2 control-label">姓名</label>
                        <div class="col-sm-10">
                            <input type="text" class="form-control" id="username"name="username" placeholder="姓名">
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="age" class="col-sm-2 control-label">年龄</label>
                        <div class="col-sm-10">
                            <input type="text" class="form-control" id="age" name="age"placeholder="年龄">
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="gender" class="col-sm-2 control-label">性别</label>
                        <div class="col-sm-10">
                            <label class="radio-inline">
                                <input type="radio" name="gender" value="1"></label>
                            <label class="radio-inline">
                                <input type="radio" name="gender" value="0"></label>
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="classes" class="col-sm-2 control-label">班级</label>
                        <div class="col-sm-10">
                            <select class="form-control" name="cls_id" id="classes">
                                {% for item in cla_list %}
                                    <option value="{{ item.id }}">{{ item.name }}</option>
                                {% endfor %}
                            </select>
                        </div>
                    </div>
                </form>
            </div>
            <div class="modal-footer">
                <span class="errorMsg" style="color: red"></span>
                <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
                <button type="button" class="btn btn-primary" id="btn-save">保存</button>
            </div>
        </div>
    </div>
</div>

<!-- Modal---删除 -->
<div class="modal fade" id="delModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
    <div class="modal-dialog" role="document">
        <div class="alert alert-danger" role="alert">
            <h3>删除学生信息?</h3>
            <div>
                <span class="errorMsg" style="color:red;"></span>
                <input type="text" id="del_id" style="display: none"/>
            </div>
            <div >
                <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
                <button type="button" class="btn btn-danger" id="btn-delete">删除</button>
            </div>
        </div>
    </div>
</div>

<!-- Modal--编辑 -->
<div class="modal fade" id="editModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
    <div class="modal-dialog" role="document">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span>
                </button>
                <h4 class="modal-title" id="myModalLabel">编辑学生数据</h4>
            </div>
            <div class="modal-body">
                <form class="form-horizontal">
                    <input type="text" class="form-control" id="userid-2"name="pid" style="display: none;">
                    <div class="form-group">
                        <label for="username-2" class="col-sm-2 control-label">姓名</label>
                        <div class="col-sm-10">
                            <input type="text" class="form-control" id="username-2"name="username" placeholder="姓名">
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="age-2" class="col-sm-2 control-label">年龄</label>
                        <div class="col-sm-10">
                            <input type="text" class="form-control" id="age-2" name="age"placeholder="年龄">
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="gender-2" class="col-sm-2 control-label">性别</label>
                        <div class="col-sm-10">
                            <label class="radio-inline">
                                <input type="radio" name="gender" value="1"></label>
                            <label class="radio-inline">
                                <input type="radio" name="gender" value="0"></label>
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="classes-2" class="col-sm-2 control-label">班级</label>
                        <div class="col-sm-10">
                            <select class="form-control" name="cls_id" id="classes-2">
                                {% for item in cla_list %}
                                    <option value="{{ item.id }}">{{ item.name }}</option>
                                {% endfor %}
                            </select>
                        </div>
                    </div>
                </form>
            </div>
            <div class="modal-footer">
                <span class="erroreditMsg" style="color: red"></span>
                <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
                <button type="button" class="btn btn-primary" id="btn-edit-save">保存</button>
            </div>
        </div>
    </div>
</div>

增加

function addStudent() {
        $("#addModal").modal('show');
    }
    $("#btn-save").on('click',function () {
        var postData={};
        $("#addModal").find("input,select").each(function () {
            console.log($(this)[0])
            var v=$(this).val();
            var n=$(this).attr("name");
            if (n=="gender"){
                if($(this).prop("checked")){
                    postData[n]=v;
                }
            }
            else {
                postData[n]=v;
            }

        });
        console.log(postData);
        $.ajax({
            url:'/addStudents/',
            type:'post',
            data:postData,
            dataType:"json",
            success:function (arg) {
                if(arg['stats']){
                    $("#addModal").modal("hide");
                    {#window.location.reload();#}
                    createRow(postData,arg['data'])
                }
                else {
                    $(".errorMsg").html(arg["message"]);
                }
            },
        });
    });
    function createRow(postData,id) {
        var tr=document.createElement("tr");
        $(tr).attr("nid",id);
        var tdId=document.createElement("td");
        $(tdId).attr("na","id");
        tdId.innerHTML=id;
        $(tr).append(tdId);

        var tdUser=document.createElement("td");
        $(tdUser).attr("na","username")
        tdUser.innerHTML=postData["username"];
        $(tr).append(tdUser);

        var tdAge=document.createElement("td");
        $(tdAge).attr("na","age")
        tdAge.innerHTML=postData["age"];
        $(tr).append(tdAge);

        var tdGender=document.createElement("td");
        $(tdGender).attr("na","gender");
        if (postData["gender"]==0){
            tdGender.innerHTML="False"
        }
        else {
            tdGender.innerHTML="True"
        }
        $(tr).append(tdGender);

        var tdCs=document.createElement("td");
        $(tdCs).attr("na","csname");
        $(tdCs).attr("cid",postData['cls_id']);

        var text=$("#addModal select[name='cls_id']").find("option[value='"+postData["cls_id"]+"']").text();
        tdCs.innerHTML=text;
        $(tr).append(tdCs);

        var tdHandle='<td><a class="fa fa-remove fa-2x del-row"></a><a class="fa fa-pencil-square-o fa-2x edit-row"></a></td>';
        $(tr).append(tdHandle);


        $("#tb").append($(tr));

        $("#tb tr[nid='"+id+"']").find("a").addClass("a-margin");
    }

  

事件处理
    $("").on(eve,[selector],[data],fn)  // 在选择元素上绑定一个或多个事件的事件处理函数。

    //  .on的selector参数是筛选出调用.on方法的dom元素的指定子元素,如:
    //  $('ul').on('click', 'li', function(){console.log('click');})就是筛选出ul下的li给其绑定
    //  click事件;

    [selector]参数的好处:
        好处在于.on方法为动态添加的元素也能绑上指定事件;如:

        //$('ul li').on('click', function(){console.log('click');})的绑定方式和
        //$('ul li').bind('click', function(){console.log('click');})一样;我通过js给ul添加了一个
        //li:$('ul').append('<li>js new li<li>');这个新加的li是不会被绑上click事件的

        //但是用$('ul').on('click', 'li', function(){console.log('click');}方式绑定,然后动态添加
        //li:$('ul').append('<li>js new li<li>');这个新生成的li被绑上了click事件
    
    [data]参数的调用:
             function myHandler(event) {
                alert(event.data.foo);
                }
             $("li").on("click", {foo: "bar"}, myHandler)

删除

$("#tb").on('click','.del-row',function () {
       $("#delModal").modal("show");
       var rowid=$(this).parent().parent().attr("nid");
       $("#del_id").val(rowid);
    });
    $("#btn-delete").click(function () {
       var nid=$("#del_id").val();
       $.ajax({
           url:'/delStudents',
           type:'get',
           data:{nid:nid},
           dataType: "json",
           success:function (arg) {
                if(!arg["status"]){
                    $(".errorMsg").html(arg["message"]);
                }
                else {
                    $("#tb").find("tr[nid='"+nid+"']").remove();
                    $("#delModal").modal('hide');
                }
           }
       });
    });

  修改

$("#tb").on('click','.edit-row',function () {
        $("#editModal").modal("show");
        $(this).parent().prevAll().each(function () {
           var n=$(this).attr('na');
           var t=$(this).text();
           if(n=="csname"){
               var cid=$(this).attr("cid");
               $("#editModal select[name='cls_id']").val(cid);
           }else if(n=="gender"){
               if(t=="True"){
                   $("#editModal :radio[value='1']").prop("checked",true);
               }else {
                   $("#editModal :radio[value='0']").prop("checked",true);
               }
           }else {
               $("#editModal input[name='"+n+"']").val(t);
           }
        });
    });
    $("#btn-edit-save").click(function () {
        var edit_post_data={};
       $("#editModal").find("select,input").each(function () {
           var n=$(this).attr('name');
           var t=$(this).val();
           if (n=="gender"){
              if($(this).prop("checked")){
                  edit_post_data[n]=t;
              }
           }else {
               edit_post_data[n]=t;
           }
       });
       console.log("post",edit_post_data);
           $.ajax({
               url:"/editStudents/",
               type:"post",
               data:edit_post_data,
               dataType:"json",
               success:function (arg) {
                   if(arg.status==200){
                       editRow(edit_post_data);
                       $("#editModal").modal("hide");
                   }else {
                       $(".erroreditMsg").text(arg.message);
                   }
               }
           });
    });
    function editRow(postData) {
        $("#tb").find("tr[nid='"+postData["pid"]+"']").children().each(function () {
           var n=$(this).attr("na");
           if(n=="csname"){
               $(this).attr("cid",postData["cls_id"]);
               var text=$("#editModal select[name='cls_id']").find("option[value='"+postData["cls_id"]+"']").text();
               $(this).text(text);
           }else if(n=="gender"){
               if(postData["gender"]==1){
                   $(this).text("True");
               }else {
                   $(this).text("False");
               }
           }else {
               $(this).text(postData[n]);
           }
        });
    }

  相关数据库

from django.db import models

# Create your models here.
class Classes(models.Model):
    """
    班级表
    """
    name=models.CharField(max_length=32)
    m=models.ManyToManyField("Teachers")

class Teachers(models.Model):
    """
    老师表
    """
    name=models.CharField(max_length=32)

class Students(models.Model):
    name=models.CharField(max_length=32)
    age=models.IntegerField()
    gender=models.NullBooleanField()
    cs=models.ForeignKey("Classes",related_name="s",on_delete=models.CASCADE)

  

from django.shortcuts import redirect,render,HttpResponse
from django.http import JsonResponse
from app01 import models
import json
def students(request):
    stu_list=models.Students.objects.all()
    cla_list=models.Classes.objects.all()
    return render(request,'students.html',locals())

def addStudents(request):
    res={'stats':True,'message':"success",'data':None}
    u=request.POST.get("username")
    a=request.POST.get("age")
    g=request.POST.get("gender")
    cls_id=request.POST.get("cls_id")
    try :
        obj=models.Students.objects.create(name=u,age=a,gender=g,cs_id=cls_id)
        res['data']=obj.id
    except Exception as e:
        res['stats'] = False
        res['message'] = "用户输入错误"
    # return HttpResponse(json.dumps(res,ensure_ascii=False))
    return JsonResponse(res)

def delStudents(request):
    nid=request.GET.get("nid")
    ret={'status':True,"message":"success"}
    try :
        models.Students.objects.filter(id=nid).delete();
    except Exception as e:
        ret["status"]=False
        ret["message"]="删除信息出错"
    return JsonResponse(ret)

def editStudents(request):
    if request.method=="POST":
        res={'status':200,"message":"success"}
        pid=request.POST.get('pid')
        user=request.POST.get('username')
        age=request.POST.get('age')
        gender=request.POST.get("gender")
        cs_id=request.POST.get('cls_id')
        print("gender",gender)
        try:
            models.Students.objects.filter(id=pid).update(name=user,age=age,gender=gender,cs_id=cs_id)
        except Exception as e:
            res['status']=205
            res['message']="输入错误"
        return JsonResponse(res)

  

posted @ 2020-06-05 16:05  徐之乔  阅读(302)  评论(0)    收藏  举报