Form组件(个人记录)

Form组件

基础定义Form类

from django import forms
class UserModelForm(forms.ModelForm):
    class Meta:
        model = models.UserInfo
        fields = ["name", "password",]
        # fields = "__all__"

form = UserModelForm()

浏览器页面显示字段优先级:

  • 建表的字段顺序
  • 自定义字段的顺序
  • 改变顺序-设定【fields】

自定义样式

widget

widget是字段的一个内在属性,用于定义字段在浏览器的页面里以何种插件(HTML元素)展现。

Widget.attrs参数

给插件添加样式或者属性

原有字段

class UserModelForm(forms.ModelForm):
    class Meta:
        model = models.UserInfo
        fields = ["name", "password",]
        widgets = {
            "name": forms.TextInput(attrs={"class": "form-control"}),
            "password": forms.PasswordInput(attrs={"class": "form-control"}),
            "age": forms.TextInput(attrs={"class": "form-control"}),
        }

新定义字段

class UserModelForm(forms.ModelForm):
    name = forms.CharField(
        min_length=3,
        label="用户名",
        widget=forms.TextInput(attrs={"class": "form-control"})
    )
    class Meta:
        model = models.UserInfo
        fields = ["name", "password", "age"]

批量修改样式

class Bootstrap:

    bootstrap_class_exclude = []

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # 循环ModelForm中的所有字段,给每个字段的插件设置
        for name, field in self.fields.items():
            if name in self.bootstrap_class_exclude:
                continue
            # 字段中有属性,保留原来的属性,没有属性,才增加。
            if field.widget.attrs:
                field.widget.attrs["class"] = "form-control"
                field.widget.attrs["placeholder"] = "请输入{}".format(field.label)
            else:
                field.widget.attrs = {
                    "class": "form-control",
                    "placeholder": "请输入{}".format(field.label)
                }

class BootstrapModelForm(Bootstrap, forms.ModelForm):
    pass


class BootstrapForm(Bootstrap, forms.Form):
    pass       

校验

自定义字段校验

如何知道有哪些默认参数

进ChoiceField源码里找__init__找到父类的super().__init__(*args, **kwargs)即可看到默认参数

validators校验手机号
from django.core.validators import RegexValidator

mobile_phone = forms.CharField(
        label="手机号",
        validators=[RegexValidator(r'^1[3-9]\d{9}$', '手机号格式错误')]
    )
限制长度、自定义报错信息
class RegisterModelForm(BootstrapModelForm):
    password = forms.CharField(
        label="密码",
        widget=forms.PasswordInput(render_value=True),
        
        min_length=8,
        max_length=64,
        
        error_messages={
            "min_length": "密码长度不能小于8个字符",
            "max_length": "密码长度不能大于64个字符",
        }
    )
required不能为空

required=true表示前端必须传参数,是默认值,可以不写
required=false表示前端不传参数的时候,会将参数置为null。因此假如参数是int这种不能赋值为null的类型,就可能会报错。

http://localhost:8088/userInfo?id=
username = forms.CharField(
        label="邮箱或手机号",
        widget=forms.TextInput(),
        required=True,
    )
render_value保留数据(不使用ajax)

render_value=True指数据提交时会刷新页面的时候保留数据在表单里

password = forms.CharField(
    label="密码",
    widget=forms.PasswordInput(render_value=True),
    required=True,
)
initial(不使用ajax)

一般用于提交数据需要刷新页面时在表单里提供默认值

钩子方法校验

方法名
def clean_[字段名](self):
获取值
变量名 = self.cleaned_data["字段名"]
自定义报错信息
from django.core.validators import ValidationError

raise ValidationError("手机号已存在")

request的数据传入Form中

def __init__(self, request, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.request = request

实例Form对象前后的参数与函数(视图函数处)

instance

传入的是某一行的数据库对象,通常用于编辑界面展示原有数据,以及编辑数据时保存数据确定的保存的数据对象

form = ModelForm(instance=row_object)

data

传入的是前端传过来的数据,一般是(request.POST),用于后端存储数据

添加指定字段错误

form.add_error("字段名","报错信息")

校验完成后的增删数据

表单对象的某一列添加修改内容再写入数据库

常常用在Form中没有将表中的所有字段生成输出框传入前端,而这些数据是需要自己手动生成的默认值

form.instance.xxxx = xxx
if form.is_valid():
    form.instance.project = request.tracer.project
    form.instance.file_type = 2
    form.instance.update_user = request.tracer.user
    form.instance.parent = parent_object
    form.save()
表单对象的某一列添加删除内容再写入数据库

常常用户获取到某个筛选条件来划分需要将数据存储到不同的表

data_dict = form.cleaned_data
xxx = data_dict.pop('xxx')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值