django form组件

1,form 组件干的事情:
1,自动生成input框
2,对提交的数据进行校验
3,有错误的信息
2,定义一个form组件:
form django import forms
class RegForm(forms.Form):
username = forms.CharField()
pwd = forms.CharField()
3,使用:
后端使用:
form_obj = RegForm()
return render(request,'reg.html',{'form_obj':form_obj})
 
form_obj = RegForm(request_POST)
form_obj.is_vaild()
form_obj.cleaned_data    ----->>>字典存放所有已经校验过得字段
前端使用:
 
{{form_obj.as_p}}   ---->>> 生成所有的input框
 
 
{{form_obj.userename}} username的input框
{{form_obj.user_name.label}}  username的标签显示文字
{{form_obj.username.id_for_label}}  input框的ID
{{form_obj.username.error}}   当前字段的所有的错误
{{form_obj.username.error.0}}  当前字段的的第一个错误
 
{{form_obj.errors}}    form表单的所有错误
 
字段类型和参数
1,
CharField()
ChoiceField()
2,  参数:
label 显示文本的长度
initail  初始化的值
min_length 最小的长度
max_length 最大的长度
required  是否必须
error_messages  = {'min_legth':'太短了','required':''}
widget = forms.widgets.PasswordInput(
attrs:{'class':'form_control'}
)
validators = [验证器1,验证器2]
 
3,验证:
1,内置的验证:
min_length
max_length
requeired
2,自定义验证器:
validators = [验证器1,验证器2]
 
form django.core.validators import RegexValidator
validator = [RexgexValidatior(r'1[3-9]\d{9}','手机号不正经')]
 
定义函数
from django.core.exceptions import ValidationError
def check(value):
if 'alex' in vale:
raise ValidationEorror('含有非法字符串')
3,钩子函数:
1,局部钩子
clean_字段名(self):
通过校验: 返回当前校验的值
不通过: raise ValidationError('不通过')
2,全局钩子
clean(self):
通过校验: self.cleaned_data
不通过;
self.add_error('re_pwd','两次的密码不一致')
raise ValidationError('不通过')
 
 
 
 
            <div class="form-group {% if form_obj.username.errors %}has-error{% endif %}">  #这里用来判断有没有错误
                <label for="{{ form_obj.pwd.id_for_label }}" class="col-sm-2 control-label">
                    {{ form_obj.pwd.label }}</label>
                <div class="col-sm-10">
                    {{ form_obj.pwd }}
                    <span class="help-block">{{ form_obj.pwd.errors.0 }}</span>
                </div>
            </div>
 
    <script>  #用来将错误消除,并且删除加的样式
        $("input").focus(function () {
            $(this).next().text("").parent().parent().removeClass('has-error')
        })
    </script>
 
 
 
def clean_username(self):
    if 'alex' in self.cleaned_data['username']:
        raise ValidationError('含有非法字符串') #主动抛出错误
    return self.cleaned_data
 
def clean(self):
    pwd = self.cleaned_data.get('pwd')
    re_pwd = self.cleaned_data.get('re_pwd')
   
    if re_pwd == pwd:
        return self.cleaned_data
    self.add_error('re_pwd','两次密码不一致') #加入到错误的字典
    raise ValidationError('两次密码不一致')
 
 
在获取到多选和单选主动刷新:
 
    # gender = forms.ChoiceField(
    #     label='性别',
    #     choices=((1, '男'), (2, '女'), (3, '未知')),
    #     widget=widgets.RadioSelect())
    # hobby = forms.fields.ChoiceField(
    #     choices=((1, "篮球"), (2, "足球"), (3, "双色球"),),
    #     label="爱好",
    #     initial=3, 默认选择第三个
    #     widget=forms.widgets.Select()
    # )
    #
    # hobby2 = forms.fields.ChoiceField(
    #     # choices=(),
    #     required=False,
    #     label="爱好2",
    #     initial=3,
    #     widget=forms.widgets.SelectMultiple()
    # )
 
 
def __init__(self, *args, **kwargs):
    #     super().__init__(*args, **kwargs)
    #     self.fields['hobby2'].choices = models.Hobby.objects.all().values_list('id', 'name')
如果在添加更多的单选或者多选条件  那么:每次替换都会更改__init__其中的属性

posted @ 2018-09-27 14:28  又见芳踪  阅读(115)  评论(0编辑  收藏  举报