forms 组件

Form 组件

  1. form表单完成的事情

    1. 提供input可以提交数据
    2. 对提交的数据进行校验
    3. 提供错误提示
  2. 定义form组件
    from django import forms

    class RegForm(forms.Form):user = forms.CharField(label='用户名')   # input 输入框 pwd = forms.CharField(label='密码')    #  label 提示  <label> 标签值
  3. 使用 form 组件
    视图中:
    form_obj = RegForm() # 实例化form对象

    return render(request, 'reg2.html', {'form_obj': form_obj})

    模板中:
    form 标签加上 novalidate 前端不进行校验
    {{ form_obj.as_p }} ——》 生成所有的p标签 label input

    {{ form_obj.errors }}   ——》所有字段的错误{{ form_obj.user }}   ——》 该字段的input框
    {{ form_obj.user.label }}   ——》 该字段的label  中文提示
    {{ form_obj.user.id_for_label }}   ——》 该字段的id
    {{ form_obj.user.errors }}   ——》 该字段的所有的错误信息
    {{ form_obj.user.errors.0 }} ——》 该字段的第一个的错误信息
    {{ form_obj.get_字段名_display }}   ——》 该字段含有  chices 的 值

    字段:
    forms.CharField(label='用户名') # input 输入框
    forms.ChoiceField(label='用户名') # select框 单选
    forms.MultipleChoiceField(label='用户名') # 多选框
    forms.EmailField(label='用户名') # Email 输入框 自动校验 email 格式
    字段的参数:
    required=True, 是否允许为空

    widget=None,                 HTML插件min_length=8                 最小长度
    max_length=16                最大长度label=None,                  用于生成Label标签或显示内容initial=None,                初始值    error_messages=None,         错误信息 {'required': '不能为空', 'invalid': '格式错                                               误','min_length':'用户名位数不足'}validators=[],               自定义验证规则  func函数 ==disabled=False,              是否可以编辑choices=((1,'男'),(2,'女'),(3,'未知'),)   多选框 或单选框的 选项widgte=forms.passwordInput()         改为密码输入框
    widgte=forms.SelectMultiple          改为多选框
    widgte=forms.RadioSelect()       改为单选列表
    widgte=forms.ChectboxSelectMutiple   改为密码输入框 

    校验:

    1. 内置校验
      required=True,min_length=8,max_length=12, ........
    2. 自定义的校验(自定义校验器)
      • 定义函数
        from django.core.exceptions import ValidationError

        def check(value):if '苍老师' in value:raise ValidationError('敏感词汇,不符合社会职业核心价值观')# 使用 添加到 自定义验证规则的  参数中
        validators=[check]
      • 正则 匹配 re
        from django.core.validators import RegexValidator
        # 手机号匹配规则
        validators=[RegexValidator(r'^1[3-9]\d{9}$', '格式不正确')]

    钩子校验: (Hook)
    1.局部钩子
    clean_字段名(self,)
    通过校验 返回通过校验的值
    不通过 抛出异常 ValidationError
    def clean_user(self):
    value = self.cleaned_data.get('user')
    if 'alex' in value:
    raise ValidationError('不符合社会职业核心价值观')

            return value

    2.全局钩子
    clean(self,)
    self.add_error(name,'错误提示')
    通过校验 返回通过校验self.cleaned_data
    不通过 抛出异常 ValidationError
    def clean(self):
    pwd = self.cleaned_data.get('pwd')
    re_pwd = self.cleaned_data.get('re_pwd')

            if pwd != re_pwd:self.add_error('re_pwd', '两次密码不一致!!@!')   # 添加错误信息raise ValidationError('两次密码不一致')   # 抛出异常return self.cleaned_data

    流程:
    form_obj = RegForm()
    form_obj = RegForm(request.POST)
    form_obj .save() 保存或 更改数据
    form_obj.is_valid() 是否通过校验
    form_obj.cleaned_data 经过校验的数据
    return render(request,'reg.html',{'form_obj ':form_obj })

    # 创建 和 修改  客户的方法  FBV
    def customer_edit(request, pk=None):''' 创建 和 修改  客户的方法  '''# 通过分组 参数 的 id 获取 要修改的对象cus_obj = models.Customer.objects.filter(pk=pk).first()# 吧要修改 的对象通过 instance 传入form组件中form_obj = CustomerForm(instance=cus_obj)if request.method == 'POST':form_obj = CustomerForm(request.POST, instance=cus_obj)if form_obj.is_valid():# 如果 instance 有对象则是修改数据 没有就是 新增数据form_obj.save()return redirect(rev_url(request, 'show:public_customer'))return render(request, "form_edit.html", {'form_obj': form_obj, 'title': "修改用户" if cus_obj else '添加用户'})class Change_user(View):  CBVdef get(self, request):'''显示用户信息 get 请求'''# 获取个人用户的对象user = UserProfileForm(instance=request.user_object)return render(request, 'form_edit.html', {'form_obj': user, 'title': '用户信息'})def post(self, request):''' 修改个人数据 '''user = UserProfileForm(request.POST, instance=request.user_object)if user.is_valid():print(user.cleaned_data)user.save()    # 修改数据return self.get(request)  #  调用自己的 get 方法 展示页面return redirect(reverse('show:change_user'))

ModelForm

from django import forms
from django.core.exceptions import ValidationError
from django.core.validators import RegexValidator
from crm import models
import hashlibclass BootstrapForm(forms.ModelForm):# 重写__init__方法  def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)for field in self.fields.values():# 给所有的字段 添加 更新 属性  class="form-control"# print(field)field.widget.attrs.update({"class": "form-control", })# 给单个 标签 设置 属性self.fields['course'].widget.attrs.update({"class": "", })# 自定义的 input 框 创建 确认密码的字段password = forms.CharField(label='密码', widget=forms.PasswordInput(), min_length=6, )# attrs = {'placeholder': '数字 字母 下划线 下划线组成 最少6位'}re_password = forms.CharField(label='确认密码', widget=forms.PasswordInput(), min_length=6, )        class Meta:model = models.UserProfile   # 要 修改的modelfields = "__all__"      # 显示所有字段# fields = ['username', 'password']  显示 指定字段exclude = ['is_active']  # 不显示的 字段 不包含# 所有的显示 中文 提示  作用不到 自己添加的字段labels = {'username': '用户名emil','password': '密码','department': '部门'}# 所有的 widgets 参数widgets = {'password': forms.PasswordInput(),}# 所有的错误信息error_messages = {'username': {'required': "不能为空",'invalid': "格式不正确"},'name': {'required': "不能为空",'invalid': "格式不正确"}}

modelForm 中 获取 关联的所有对象 一对多

不同字段的显示

  1. 普通字段
    {{ customer.qq }}

  2. 含有choices字段
    {{ customer.get_sex_display }} # get_字段名_display() 方法 模板中不加()

  3. 其他字段
    多对多、特殊显示,在model中定义方法。
    def show_classes(self):
    return ' | '.join([str(i) for i in self.class_list.all()])

    def show_status(self):color_dict = {'signed': 'green','unregistered': 'red','studying': 'blue','paid_in_full': 'yellow',}return '<span style="background-color: {};color: white;padding: 3px">{}</span>'.format(color_dict.get(self.status),self.get_status_display())

modelfromset 可修改的 form 在视图中使用

from django.forms import modelformset_factoryform_set_obj = modelformset_factory(models.StudyRecord, StudyRecordForm, extra=0)study_record_list = models.StudyRecord.objects.filter(pk=id)form_obj = form_set_obj(queryset=study_record_list)if request.method == 'POST':form_obj = form_set_obj(request.POST, queryset=study_record_list)if form_obj.is_valid():form_obj.save()return redirect(-----)return render(request, '------.html', {'form_obj': form_obj})

模板中使用

{{ form.instance }}   模板中使用原始的 form表单内容

注意 不然报错

form 表单中 要有  {{ form_obj.management_form }}
每一行中要有  {{ form.id }}

转载于:https://www.cnblogs.com/zhang-zi-yi/p/10187739.html

Django Form ModelForm modelfromset相关推荐

  1. Django Form和ModelForm组件

    Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...

  2. Django - Form和ModelForm

    一. form介绍 1.生成页面可用的HTML标签 2. 提供input可以提交数据 3. 对用户提交的数据进行校验 4. 保留上次输入内容 5. 提供错误信息 二. 普通方式书写注册功能 <! ...

  3. Django中的Form ModelForm

    Django中的Form & ModelForm 在web开发中,处理表单是家常便饭,我们当然可以直接在模板中编写原生的html表单,然后在后端进行表单验证,这常常是一项繁琐的工作. Form ...

  4. Django form表单

    Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...

  5. Django form模块使用心得

    http://forreal.blog.51cto.com/3205122/586035 最近用Django 写了一个网站,现在来分享一下对Django form 的一些心得. 一,创建一个表单 创建 ...

  6. Django之ModelForm使用

    一:什么是ModelForm呢? Model + Form ==> ModelForm.model和form的结合体,所以有以下功能: 数据验证 数据库操作 model有操作数据库的字段,for ...

  7. Python基础教程:一次性搞定 Django Form

    最近在项目上用到了 Django 的自带的 Form 表单,遇到了一些坑,今天给大家出的这篇Python基础教程也是做了一个简单的总结,大家可以对号出坑. Form 基础介绍 首先让我们先来了解下 D ...

  8. Django Form表单组件

    Form介绍 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否 ...

  9. 一篇文章浅析Django Form组件相关知识

    击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 灭烛怜光满,披衣觉露滋. 前言 在上 ...

最新文章

  1. Spring3.1新属性管理API:PropertySource、Environment、Profile
  2. C++11学习之share_ptr和weak_ptr
  3. Divide and conquer:K Best(POJ 3111)
  4. spark 源码分析之十八 -- Spark存储体系剖析
  5. Redis 教程基于win10:1介绍
  6. CF1260C-Infinite Fence【结论题】
  7. (五)Maven中的聚合和继承
  8. mc用云服务器搭建_最全的云服务器架设我的世界私服教程,不看后悔哦!
  9. border-collapse 关于继承问题
  10. chromebook刷_使用Chromebook编码
  11. 实际项目开发管理流程图
  12. android device id修改器,修改硬盘ID硬盘序列号工具(Serial Number Changer)
  13. ASPUpLoad 文件上传
  14. 学习笔记10--多传感器融合定位技术
  15. vim显示缩进对齐线
  16. sd卡计算机无法读取数据,细说电脑无法读取sd卡
  17. android pc摄像头驱动,Android 驱动USB摄像头
  18. Trading Convexity for Scalability
  19. IDEA 配置 maven
  20. 改革人工智能时代的劳动技能教育

热门文章

  1. Linux系统盘爆满根目录100%,又找不到占空间的大文件 原因与解决方法
  2. Python打基础一定要吃透这68个内置函数
  3. Linux的链接工具 putty 以及一些命令。
  4. java 匿名类实现6_java匿名内部类,以及实现Comparato和Comparable接口实现对对象的排序...
  5. SSM 生成mapper中xml文件:未能解析映射资源:“文件嵌套异常
  6. 微信小程序获取windowHeight出现不同页面高度不一致问题及解决方案
  7. layui 解决浏览器自动填充form表单账号和密码输入框的问题
  8. nginx导致的session丢失的解决方法
  9. 【部署问题】解决Nginx: [error] open() "/usr/local/Nginx/logs/Nginx.pid“ failed(2:No such file or directory)
  10. 如何为新项目创建新的空分支