Django Form 随记

渲染Form

  • 手工渲染字段:{{ form.name_of_field }
    • 渲染该字段的input标签
  • 渲染某个字段的错误提示信息{{ form.name_of_field.errors }}
  • 得到某个字段的label的id{{ form.name_of_field.id_for_label}}
  • 得到某个字段的label名:{{ form.name_of_field.label }}

创建表单类的一些有用的总结

  • 一个Form类可以继承自forms.Formforms.ModelForm,前者用来做查询表单,后者做可以查询和修改的表单
  • Form类的元类:
    • 元类的model属性用来控制该表单关联的model
    • fields控制从关联的model中取出哪些属性作为表单的字段
    • widgets属性控制你的form的属性所使用的widget,其用法同单独写一个属性时设置的widget属性,注意两个不同地方的属性名称注意最后的s
    • 我们可以重写表单的init方法 添加一些我们的初始化的操作
class YsryYdMainForm(forms.ModelForm):
    class Meta:
        model = YdMain
        fields = [
            'yd_id',
            # 'project',
            # 'method_id',
            'question_amount',
            'yd_commit_case',
            'yd_commit_manid',
            'yd_commit_date',
            'inspect_com',
            'yd_made_date',
        ]
        # 这里也是一种为每个字段设置widget的方法,记得在元类里由于是设置多个所以该属性为widgets,而单一字段中是widget
        widgets = {'yd_commit_case': forms.Textarea()}

    def __init__(self, *args, **kwargs):
        super(YsryYdMainForm, self).__init__(*args, **kwargs)
        for field_name in self.fields:
            field = self.fields.get(field_name)
            if type(field) == forms.ModelChoiceField:  # 使用type精确判断一个对象是什么类
                field.widget.attrs.update({
                    'class':
                    'form-control selectpicker',
                    'data-live-search':
                    'true',
                })
            elif type(field) == forms.ModelMultipleChoiceField:
                field.widget.attrs.update({
                    'class': 'form-control m2mselect',
                })
            elif type(field) == forms.DateField:
                field.widget.attrs.update({
                    'class': 'form-control',
                    'readonly': '',
                })
            else:
                field.widget.attrs.update({'class': 'form-control'})
  • 表单中一些字段让系统自动填值:我们需要自动填值的字段不在页面中显示,但是需要在form类的字段中有,不然当你往form类的对象中添加属性保存时会报错。

在views中动态控制表单的下拉选择控件的内容

  • 由于要使用到request所以只能在views中控制,否则可以在forms中直接控制
 # 在视图中控制下拉框之类的数据集,能实现此也就是说可以在视图中动态控制表单类的对象
        ydform=YdMainForm()
        ydform.fields.get(
            'project').widget.choices.queryset = Project.objects.filter(
                people=request.user.people.people_id)


表单类的填写使用总结

  1. 单独的填写入库的操作中,form表单的is_valid验证只验证form类中包含的表单字段,form类中不包含的字段,即使其model中是必填项,form类的验证依旧可以通过且可以强制入库。
  2. 也就是说form类的验证一旦通过,form类的save就可以被执行,而且是强制执行。
  3. 如果你只需要更改一张form类的一部分字段的值,那么你的form类定义Meta时要指明,不在form类定义的字段,不会再填写时收到影响。
  4. form类字段自然循环的顺序与model类中属性放置的顺序相同
  5. 如果是这样一个场景:你要使用form类去生成表单并保存你的表单中的输入内容,此时有几个字段你不让人员手工填写,需要后台自动填写时,你可以不在前台显示该字段,在后台给表单传入request.POST的一个复制,在其中添加需要后台赋值的值。

使用Form和ModelForm保存数据的方法

  • 简单来讲使用Form类表单来实现数据提交保存数据需要利用Form表单的is_valid方法验证表单内容后,使用clean_data获取表单的值,最后通过使用Model手动创建一个新的对象并保存进入数据库。
  • 使用ModelForm保存数据就是当ModelForm的is_valid表单校验通过后,使用ModelForm的save方法直接就可实现对数据的保存入库。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值