• form


    form操作动态select数据

    forms.py

    from django import forms
    from django.forms import fields
    from django.forms import widgets
    from django.forms.models import ModelChoiceField
    from app01 import models
    class UserInfoForm(forms.Form):
        user = fields.CharField(
            required=True,
            widget=widgets.Textarea(attrs={'class':'c1'})
        )
        pwd = fields.CharField(
            max_length=12,
            widget=widgets.PasswordInput(attrs={'class':'c1'})
        )
      #方式一 user_type
    = fields.ChoiceField( # choices=[(1,'普通用户'),(2,'超级用户')],
         choices = [], widget = widgets.Select )
      #方式二 user_type2
    = fields.CharField(widget=widgets.Select(choices=[]))
      #方式三 models.py中需要加上def __str__(self):return self.name
      user_type3
    = ModelChoiceField( empty_label='请选择用户类型', to_field_name='name',#html的源码里面value=name对应值 queryset=models.UserType.objects.all() ) def __init__(self,*args,**kwargs): super(UserInfoForm, self).__init__(*args,**kwargs) self.fields['user_type'].choices = models.UserType.objects.values_list('id','name')#在执行构造函数的时候去数据库取数据,value_list返回的是列表里面加元祖 self.fields['user_type2'].widget.choices = models.UserType.objects.values_list('id','name')

    views.py

    from django.shortcuts import render
    from app01.forms import UserInfoForm
    from app01 import models
    # Create your views here.
    def index(request):
        obj = UserInfoForm()
        # obj.fields['user_type'].choices = models.UserType.objects.values_list('id','name')
        #类里面的静态字段,必须重新去数据库取值赋值,或者在forms.py中构造函数中取值
        return render(request,'index.html',{'obj':obj})

    index.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <p>
            {{ obj.user }}
        </p>
        <p>
            {{ obj.pwd }}
        </p>
        <p>
            {{ obj.user_type }}
            {{ obj.user_type2 }}
        </p>
    </body>
    </html>

     form内置钩子

    通过obj.is_valid()查看源码

    用户注册在提交的时候需要判断用户是否已经注册,用clean_name

    验证过程:

      正则+clean_字段->clean(__all__)->_post_clean

    forms.py

    class RegisterForm(forms.Form):
        user = fields.CharField()
        email = fields.EmailField()
        def clean_name(self):
            c = models.User.objects.filter(name=self.cleaned_data['user']).count()
            if c:
                return self.cleaned_data['user']
            else:
                raise ValidationError('用户名已经存在',code='xxx')
        def clean(self):
            return self.cleaned_data#整体错误信息在__all__里

    序列化

    QuerySet

    第一种:

      from django.core import serializers

      v = models.tb.objects.all()

      data = serializers.serialize('json',v)

    第二种

    import json
    from django.core.exceptions import ValidationError
    
    class JsonCustomEncoder(json.JSONEncoder):
        def default(self, field):
            if isinstance(field,ValidationError):
                return{'code':field.code,'messages':field.messages}
            else:
                return json.JSONEncoder.default(self,field)
    
    v= models.tb.objects.values('id','name')
    v = list(v)
    v = json.dumps(v,cls=JsonCustomEncoder)

    ajax提交 html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <form id="info">{% csrf_token %}
            <p><input type="text" name="username"/></p>
            <p><input type="password"name="pwd"/></p>
            <a id="submit">提交</a>
        </form>
        <script src="/static/jquery-1.12.4.js"></script>
        <script>
            $(function () {
                $('#submit').click(function () {
                    $.ajax({
                        url:'/login/',
                        type:'POST',
                        data:$('#info').serialize(),#获取form表单中的所有
                        success:function (arg) {
                            console.log(arg);
                            arg = JSON.parse(arg);
                            console.log(arg);
    
                        },
                        error:function () {
                            
                        }
                    })
                })
    
            })
        </script>
    </body>
    </html>

    views.py

    from django.shortcuts import render,HttpResponse
    from app01.forms import LoginForm
    import json
    from django.core.exceptions import ValidationError
    
    class JsonCustomEncoder(json.JSONEncoder):
        def default(self, field):
            if isinstance(field,ValidationError):
                return{'code':field.code,'messages':field.messages}
            else:
                return json.JSONEncoder.default(self,field)
    def login(request):
        if request.method == 'GET':
            return render(request,'login.html')
        elif request.method == 'POST':
            ret = {'status':True,'error':None,'data':None}
            obj = LoginForm(request.POST)
            if obj.is_valid():
                print(obj.cleaned_data)
            else:
                # ret['error'] = obj.errors.as_json()#返回字符串
                ret['error'] = obj.errors.as_data()#返回字典   key-validationerror
            result = json.dumps(ret,cls=JsonCustomEncoder)
            # return HttpResponse(json.dumps(ret))
            return HttpResponse(result)

    ModelForm组件

     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    ModelForm
        a.  class Meta:
                model,                           # 对应Model的
                fields=None,                     # 字段
                exclude=None,                    # 排除字段
                labels=None,                     # 提示信息
                help_texts=None,                 # 帮助提示信息
                widgets=None,                    # 自定义插件
                error_messages=None,             # 自定义错误信息(整体错误信息from django.core.exceptions import NON_FIELD_ERRORS)
                field_classes=None               # 自定义字段类 (也可以自定义字段)
                localized_fields=('birth_date',) # 本地化,如:根据不同时区显示数据
                如:
                    数据库中
                        2016-12-27 04:10:57
                    setting中的配置
                        TIME_ZONE = 'Asia/Shanghai'
                        USE_TZ = True
                    则显示:
                        2016-12-27 12:10:57
        b. 验证执行过程
            is_valid -> full_clean -> 钩子 -> 整体错误
     
        c. 字典字段验证
            def clean_字段名(self):
                # 可以抛出异常
                # from django.core.exceptions import ValidationError
                return "新值"
        d. 用于验证
            model_form_obj = XXOOModelForm()
            model_form_obj.is_valid()
            model_form_obj.errors.as_json()
            model_form_obj.clean()
            model_form_obj.cleaned_data
        e. 用于创建
            model_form_obj = XXOOModelForm(request.POST)
            #### 页面显示,并提交 #####
            # 默认保存多对多
                obj = form.save(commit=True)
            # 不做任何操作,内部定义 save_m2m(用于保存多对多)
                obj = form.save(commit=False)
                obj.save()      # 保存单表信息
                obj.save_m2m()  # 保存关联多对多信息
     
        f. 用于更新和初始化
            obj = model.tb.objects.get(id=1)
            model_form_obj = XXOOModelForm(request.POST,instance=obj)
            ...
     
            PS: 单纯初始化
                model_form_obj = XXOOModelForm(initial={...})

     

    forms.py

    from django import forms
    from django.forms import fields
    from django.forms import widgets as Fwidgets
    from app01 import models
    
    
    class UserInfoModelForm(forms.ModelForm):
       #自定义 
      is_rmb
    = fields.CharField( widget=Fwidgets.CheckboxInput() ) class Meta: model = models.UserInfo fields = '__all__' # fields = ['username','pwd'] # exclude = ['username'] labels={ 'username':'用户名', 'email':'邮件' } widgets = { 'username':Fwidgets.Textarea(attrs={'class':'c1'}) } error_messages = { 'email':{ 'required':'邮箱不能为空', } }

    views.py

    from django.shortcuts import render
    from app01 import forms
    from app01 import models
    # Create your views here.
    def index(request):
        if request.method == 'GET':
            obj = forms.UserInfoModelForm()
            return render(request,'index.html',{'obj':obj})
        elif request.method == 'POST':
            obj = forms.UserInfoModelForm(request.POST)
            if obj.is_valid():
                obj.save()
            return render(request, 'index.html', {'obj': obj})
    
    def user_list(request):
        obj = models.UserInfo.objects.all().select_related('type')
        return render(request,'user_list.html',{'obj':obj})
    
    def edit(request,nid):
        if request.method=='GET':
            obj = models.UserInfo.objects.filter(id=nid).first()
            mf = forms.UserInfoModelForm(instance=obj)
            return render(request,'user_edit.html',{'mf':mf,'id':nid})
        elif request.method == 'POST':
            obj = models.UserInfo.objects.filter(id=nid).first()
            mf = forms.UserInfoModelForm(request.POST,instance=obj)
            if mf.is_valid():
                mf.save()
            else:
                print(mf.errors.as_json())
            return render(request, 'user_edit.html', {'mf': mf, 'id': nid})
  • 相关阅读:
    Kinect研究文档
    Unity使用Win10语音
    使用unity2017.3 vuforia7摄像头放大的问题
    Unity响应Android的返回键,退出当前Activity
    unity调用Android百度地图
    Unity带参数的协程
    Android jenkins动态参数配置
    如何下载浏览器视频
    mac 如果修改环境变量
    mac如何修改hosts文件
  • 原文地址:https://www.cnblogs.com/hongpeng0209/p/6713721.html
Copyright © 2020-2023  润新知