form表单和modelform

1、Form表单

    引言:请看下面的例子。
    有这么一个form表单:
         <form action="" method="post">
            主机:<input type="text" name="host"/>
            <br/>
            端口:<input type="text" name="port"/>
            <br/>
            邮箱:<input type="text" name="email"/>
            <br/>
            电话:<input type="text" name="mobile"/>
            <br/>
            <input type="submit" value="提交"/>
        </form>
    数据提交到后台时,我们在视图函数中一般这么处理:
    def handle_form(request):
        if request.method == 'POST':
            host = request.POST.get('host')
            port = request.POST.get('port')
            mail = request.POST.get('mail')
            mobile = request.POST.get('mobile')
            # 判断数据是否为空, 提示用户哪个错误
             # ...
             # 判断格式是否正确,提示用户哪个错误。
             # ...
             # 数据库校验
             # filter(host=host,port=port,mail=mail,mobile=mobile)
             # create(host=host,port=port,mail=mail,mobile=mobile)
             # 无法保留上一次提交的数据
             # 
            return render(request, 'user_list.html')
        else:
            return render(request, 'user_list.html')
    使用django的form可以把以上步骤都节约。

2、Django的form的作用

先定义form类
    from django import forms

    class UserInfoForm(forms.Form):
        email = forms.EmailField(required=False)
        host = forms.CharField()
        port = forms.CharField()
        mobile = forms.CharField()
1)生成html标签
    <form action="{% url 'django-form' %}" method="post">
        主机:{{ form.host }}
        <br/>
        端口:{{ form.port }}
        <br/>
        邮箱:{{ form.email }}
        <br/>
        手机:{{ form.mobile }}
        <br/>
        <input type="submit" value="提交"/>
        </form>
        还可以使用form.as_table,form.as_p,form.as_ul来自动生成form标签

        手动绘制form:

            <div class="fieldWrapper">
            {{ form.host.errors }}
            <label for="{{ form.host.id_for_label }}">Email subject:</label>
            {{ form.subject }}
            </div>

        或者:

            <div class="fieldWrapper">
                {{ form.host.errors }}
                {{ form.host.label_tag }}
                {{ form.host }}
            </div>

        或者,循环读取form中的字段来显示form:

            {% for field in form %}
            <div class="fieldWrapper">
                {{ field.errors }}
                {{ field.label_tag }} {{ field }}
                {% if field.help_text %}
                <p class="help">{{ field.help_text|safe }}</p>
                {% endif %}
            </div>
            {% endfor %}

    2) 用来做用户提交的验证

        form.is_valid()方法返回True 或False,表明用户输入的数据是否合法,是否通过校验。
        如用户输入的数据不合法,错误信息将会放在form.errors这个字典中。key是字段名,value是字段的错误描述。
        合法数据将会放在cleaned_data中。cleaned_data是一个字典。通常获取form中数据的方法是先判断一个form数据是否合法,如果合法则去cleaned_data中取值:
            if form.is_valid():
                subject = form.cleaned_data['subject']

扫描二维码关注公众号,回复: 2338360 查看本文章

3、 form表单定制化

    1)自定义报错内容
        在form里有一个参数:error_messages,可以通过此参数定制报错内容。比如:
            email = forms.EmailField(required=True,error_messages={'required':u'邮箱不能为空'})
    2)给form表单添加一个属性,通过widget的attr属性来添加额外的属性。比如:
        mobile = forms.CharField(error_messages={'required':u'手机不能为空'},
                              widget=forms.TextInput(attrs={'class':'form-control','placeholder':u'手机号码'})
                                    #这里默认是TextInput,标签
                              )
    
    3)自定义校验规则。通过form的validators来指定自定义的校验规则。比如:
        def mobile_validate(value):
            mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$') #正则匹配
            if not mobile_re.match(value):
                raise ValidationError('手机号码格式错误')
        mobile = forms.CharField(validators=[mobile_validate,],#应用咱们自己定义的规则
                              error_messages={'required':u'手机不能为空'},
                              widget=forms.TextInput(attrs={'class':'form-control','placeholder':u'手机号码'})
                              )
    5)修改默认的控件,比如生成select标签
        user_type_choice = (
            (0, u'普通用户'),+
            (1, u'高级用户'),)
        user_type = forms.IntegerField(widget=forms.widgets.Select(choices=user_type_choice,attrs={'class':'form-control'}))
    6)生成form表单初始化数据,使用initial属性,比如:
        name = forms.CharField(initial='Your name')、

4、ModelForm

    如果不想写form中的那些字段定义,可以直接从Model的字段中定义ModelForm来生成form
基础用法是通过class Meta来指定model和想在form中使用的字段,比如:
    class AuthorForm(ModelForm):
        class Meta:
            model = Author
            fields = ['name', 'title', 'birth_date']
    
modelform的save方法可以直接将form中的数据保存到model中。

猜你喜欢

转载自blog.csdn.net/yx1179109710/article/details/81173260