• Django(十六)Form组件扩展


     http://www.cnblogs.com/wupeiqi/articles/6144178.html

    Form组件
    - form表单(验证;保留上次内容)
    -
    - Ajax(验证;无需上次内容)
    - 返回HttpResponse
    - 前端:跳转或错误信息

    from django.core.exceptions import NON_FIELD_ERRORS, ValidationError
    class AjaxForm(forms.Form):
        username = fields.CharField()
        user_id = fields.IntegerField(
            widget=widgets.Select(choices=[(0,'alex'),(1,'刘皓宸'),(2,'杨建'),])
        )
        # 自定义方法 clean_字段名
        # 必须返回值self.cleaned_data['username']
        # 如果出错:raise ValidationError('用户名已存在')
        def clean_username(self):
            v = self.cleaned_data['username']
            if models.UserInfo.objects.filter(username=v).count():
                # 整体错了
                # 自己详细错误信息
                raise ValidationError('用户名已存在')
            return v
        def clean_user_id(self):
            return self.cleaned_data['user_id']
    
    def ajax(request):
        if request.method == 'GET':
            obj = AjaxForm()
            return render(request,'ajax.html',{'obj':obj})
        else:
            ret = {'status':'NG','message':None}
            import json
            obj = AjaxForm(request.POST)
            if obj.is_valid():
                # 跳转到百度
                # return redirect('http://www.baidu.com')
                # if ....
                #     obj.errors['username'] = ['用户名已经存在',]
                # if ....
                #     obj.errors['email'] = ['用户名已经存在',]
    
                ret['status'] = 'OK'
                return HttpResponse(json.dumps(ret))
            else:
                # print(type(obj.errors))
                # print(obj.errors)
                from django.forms.utils import ErrorDict
                # print(obj.errors.as_ul())
                # print(obj.errors.as_json())
                # print(obj.errors.as_data())
    
    
    
                ret['message'] = obj.errors
                # 错误信息显示在页面上
                return HttpResponse(json.dumps(ret))
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <form id="fm" method="POST" action="/ajax/">
            {% csrf_token %}
            {{ obj.as_p }}
            <input type="button" value="Ajax提交" id="btn" />
        </form>
        <script src="/static/jquery-3.1.1.js"></script>
        <script>
            $(function () {
                $('#btn').click(function () {
                    $.ajax({
                        url: '/ajax/',
                        type: 'POST',
                        data: $('#fm').serialize(),
                        dataType: 'JSON',
                        success:function (arg) {
    
                            // arg: 状态,错误信息
                            if (arg.status == 'OK'){
                                window.location.href = "http://www.baidu.com"
                            }
                            console.log(arg);
                        }
                    })
    
    
                })
    
    
            })
        </script>
    </body>
    </html>

    1. Form组件扩展:

        1.简单扩展
            利用Form组件自带的正则扩展:
                a. 方式一
                    from django.forms import Form
                    from django.forms import widgets
                    from django.forms import fields
                    from django.core.validators import RegexValidator
                     
                    class MyForm(Form):
                        user = fields.CharField(
                            error_messages={'invalid': '...'},
                            validators=[RegexValidator(r'^[0-9]+$', '请输入数字'), RegexValidator(r'^159[0-9]+$', '数字必须以159开头')],
                        )
                b. 方式二
                    from django.forms import Form
                    from django.forms import widgets
                    from django.forms import fields
                    from django.core.validators import RegexValidator
                     
                    class MyForm(Form):
                        user = fields.RegexField(r'^[0-9]+$',error_messages={'invalid': '...'})
        2.基于源码流程
            a. 单字段
                from django.core.exceptions import NON_FIELD_ERRORS, ValidationError
                class AjaxForm(forms.Form):
                    username = fields.CharField()
                    user_id = fields.IntegerField(
                        widget=widgets.Select(choices=[(0,'alex'),(1,'刘皓宸'),(2,'杨建'),])
                    )
                # 自定义方法 clean_字段名
                # 必须返回值self.cleaned_data['username']
                # 如果出错:raise ValidationError('用户名已存在')
                def clean_username(self):
                    v = self.cleaned_data['username']
                    if models.UserInfo.objects.filter(username=v).count():
                        # 整体错了
                        # 自己详细错误信息
                        raise ValidationError('用户名已存在')
                    return v
                def clean_user_id(self):
                    return self.cleaned_data['user_id']
                        
                     
            b. 整体错误验证
                class AjaxForm(forms.Form):
                    username = fields.CharField()
                    user_id = fields.IntegerField(
                        widget=widgets.Select(choices=[(0,'alex'),(1,'刘皓宸'),(2,'杨建'),])
                    )
                    # 自定义方法 clean_字段名
                    # 必须返回值self.cleaned_data['username']
                    # 如果出错:raise ValidationError('用户名已存在')
                    def clean_username(self):
                        v = self.cleaned_data['username']
                        if models.UserInfo.objects.filter(username=v).count():
                            # 整体错了
                            # 自己详细错误信息
                            raise ValidationError('用户名已存在')
                        return v
                    def clean_user_id(self):
                        return self.cleaned_data['user_id']
    
                    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
                        
                        
            PS: _post_clean
                    
             
    2. Django序列化
        a.对象
        b.字典
        c.元祖

    2. Django序列化

    from django.shortcuts import render
    from django.shortcuts import HttpResponse
    from app01 import models
    import json
    def xuliehua(request):
    
        return render(request,'xuliehua.html')
    
    """
    def get_data(request):
        user_list = models.UserInfo.objects.all()
        return render(request,'get_data.html',{'user_list':user_list})
    """
    def get_data(request):
        from django.core import serializers
    
        ret = {'status':True,'data':None}
        try:
            # user_list = models.UserInfo.objects.all()
            # QuerySet【obj,obj,obj】
            # ret['data'] = serializers.serialize("json",user_list)
            # // var
            # v = JSON.parse(arg.data);
            # // console.log(v);
    
            # user_list = models.UserInfo.objects.all().values('id','username')
            # ret['data'] = list(user_list)
            # console.log(arg.data);
    
            # user_list = models.UserInfo.objects.all().values_list('id', 'username')
            # ret['data'] = list(user_list)
            # console.log(arg.data);
            pass
        except Exception as e:
            ret['status'] = False
        result = json.dumps(ret)
        return HttpResponse(result)
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>用户列表</h1>
        <table id="tb">
    
        </table>
        <script src="/static/jquery-3.1.1.js"></script>
        <script>
            $(function () {
                initData();
            });
            function initData() {
                $.ajax({
                    url :'/get_data/',
                    type:'GET',
                    dataType:'JSON',
                    success:function (arg) {
                        //$('#tb').append(arg);
                        if(arg.status){
                            console.log(arg.data);
                            //var v = JSON.parse(arg.data);
                            //console.log(v);
                        }
                    }
                })
            }
        </script>
    </body>
    </html>
    html
  • 相关阅读:
    Mybatis用到的设计模式和常用类原理
    svn 版本迁移到 git 仓库
    mysql 主从master-slave同步复制 配置,为读写分离准备
    java.lang.NoSuchFieldError 异常原因
    PropertiesFactoryBean PropertyPlaceholderConfigurer 区别
    关于BigDecimal 和 double 类型保存金钱,以及精度问题,银行家舍入法
    mysql遇到锁表常用命令
    代码质量管理工具 sonar 配置
    java 环境变量java_home配置多加了 导致zookeeper莫名其妙问题。
    svn 版本转为git
  • 原文地址:https://www.cnblogs.com/xiangtingshen/p/10678744.html
Copyright © 2020-2023  润新知