zoukankan      html  css  js  c++  java
  • Django(Form,ModelForm)

    FORM表单:

    Django表单系统中,所有的表单类都作为django.forms.Form的子类创建,包括ModelForm

    关于django的表单系统,主要分两种

    基于django.forms.Form:所有表单类的父类

    基于django.forms.ModelForm:可以和模型类绑定的Form

    需求:向数据库的Info表中添加一些新的个人信息

    FORM的用法

    from django import forms
    from app01 import models
    from django.core.exceptions import ValidationError
    
    class Info_form(forms.Form):
    
        def validate_name(value):
            try:
                models.Info.objects.get(name=value)
                raise ValidationError('%s 的信息已经存在!'%value)
            except models.Info.DoesNotExist:
                pass
    
        sex_choice=((0,'男'),
                    (1,'女'))#select的数据可以像这样写,也可以在另外一张表中动态去拿
    
    
        name = forms.CharField(validators=[validate_name],label='姓名',error_messages={'required':'必填'})
    
        age = forms.CharField(label='年龄',error_messages={'required':'必填'})
    
        # sex = forms.CharField(label='性别',error_messages={'required':'必填',},)
        sex=forms.IntegerField(widget=forms.widgets.Select(choices=sex_choice,
    
                                                           attrs={'class':'setform2'}
                                                           ))
    
        birthday = forms.CharField(label='生日',error_messages={'required':'必填'})
    
        qualification = forms.CharField(label='学历',error_messages={'required':'必填'},
                                        widget=forms.TextInput(attrs={'class':'formset',
                                                            'placeholder':'本科'
                                                            }
                                        ))
        email=forms.EmailField(max_length=100,min_length=10)
    
        job = forms.CharField(label='工作',error_messages={'required':'必填'})
    
    
    
        def  __init__(self,*args,**kwargs):
    
            super(Info_form,self).__init__(*args,**kwargs)
    
            self.fields['hobby']=forms.CharField(widget=forms.widgets.Select(choices=models.Hobby.objects.values_list('id','item')))
    
    
    
    #-------------------------------------------------------views.py
    #-------------------------------------------------------
    
    
    from django.shortcuts import render,HttpResponse
    
    # Create your views here.
    
    from app01.models import *
    
    from app01.forms import *
    
    def add_info(req):
        if req.method=='POST':
    
            Info_form_obj=Info_form(req.POST)
            if Info_form_obj.is_valid():
    
                Info.objects.create(name=Info_form_obj.cleaned_data['name'],
                                    age=Info_form_obj.cleaned_data['age'],
                                    sex=Info_form_obj.cleaned_data['sex'],
                                    birthday=Info_form_obj.cleaned_data['birthday'],
                                    qualification=Info_form_obj.cleaned_data['qualification'],
                                    job=Info_form_obj.cleaned_data['job']
                                 )
                return HttpResponse('添加成功!')
            else:
    
                error_obj=Info_form_obj.errors
                print('***************')
                print(type(error_obj))#<class 'django.forms.utils.ErrorDict'>
    
                print(error_obj['name'][0])#必填
    
                print(error_obj.get('age'))#<ul class="errorlist"><li>必填</li></ul>
                return render(req,'add_info.html',{'form_obj':Info_form_obj,'error_obj':error_obj})
    
    
        Info_form_obj=Info_form()
        return render(req,'add_info.html',{'form_obj':Info_form_obj})
    
    
    #------------------------------------------------------add_info.html
    #-------------------------------------------------------
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>添加个人信息</title>
        <style>
            .formset{
                color: rebeccapurple;
                border: dashed cadetblue;
            }
        </style>
    </head>
    <body>
         <form action="{% url 'add_info' %}" method="post">
    
    
             <p>姓名{{ form_obj.name }}{{ error_obj.name.0 }}</p>
             <p>年龄{{ form_obj.age }}{{ error_obj.age.0 }}</p>
             <p>生日{{ form_obj.birthday }}{{ error_obj.birthday.0 }}</p>
             <p>工作{{ form_obj.job }}<span>{{ error_obj.job }}</span></p>
             <p>学历{{ form_obj.qualification }}<span>{{ error_obj.qualification }}</span></p>
             <p>性别{{ form_obj.sex }}<span>{{ error_obj.sex }}</span></p>
             <p>邮箱{{ form_obj.email }}<span>{{ error_obj.email }}</span></p>
             <p>爱好{{ form_obj.hobby }}<span>{{ error_obj.hobby }}</span></p>
    
    
             {#          {{ form_obj.as_p }}#}
    
               <input type="submit" value="提交"><br>
              {% csrf_token %}
         </form>
    </body>
    </html>


    MODELFORM基本操作:

    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={...})
     
  • 相关阅读:
    33选6算法:M个数N个为一组,无重复的排列组合
    文件墙 CFilewall
    公司代码阅读笔记 记于 2013-09-23
    简单的同步MSMQ
    Markdown 使用说明
    Freezable 对象(WPF)
    AngularJS-入门篇
    第二节Unity3D开发环境安装(windows系统)
    第一节Unity3D简介
    数据库出现可疑解决办法
  • 原文地址:https://www.cnblogs.com/575dsj/p/7631317.html
Copyright © 2011-2022 走看看