form modelform formset modelformset的各种用法

 

首先上结论:

  form适用于对单个表单的操作,并且需要对每个字段的验证规则自定义。

  modelform:适用于对用户提交的单个表单操作,字段可以用model中的表的字段来作为验证规则,适用于快速的进行增加、修改。

  formset:适用于对多个表单进行操作,字段需要也可以用model中的表的字段来作为验证规则。

  modelfoemset:适用于对多个表单进行操作,字段需要也可以用model中的表的字段来作为验证规则,速度可能快一些(有待考证)

form用法

后端代码

  1. from django.forms import widgets
  2.  
  3. wid_01=widgets.TextInput(attrs={"class":"form-control"})
  4. wid_02=widgets.PasswordInput(attrs={"class":"form-control"})
  5.  
  6. class UserForm(forms.Form):
  7. name=forms.CharField(max_length=32,
  8. widget=wid_01
  9. )
  10. pwd=forms.CharField(max_length=32,widget=wid_02)
  11. r_pwd=forms.CharField(max_length=32,widget=wid_02)
  12. email=forms.EmailField(widget=wid_01)
  13. tel=forms.CharField(max_length=32,widget=wid_01)
  14.  
  15. def register(request):
  16.  
  17. if request.method=="POST":
  18. form=UserForm(request.POST)
  19. if form.is_valid():
  20. print(form.cleaned_data) # 所有干净的字段以及对应的值
  21. else:
  22. print(form.cleaned_data) #
  23. print(form.errors) # ErrorDict : {"校验错误的字段":["错误信息",]}
  24. print(form.errors.get("name")) # ErrorList ["错误信息",]
  25. return HttpResponse("OK")
  26. form=UserForm()
  27. return render(request,"register.html",locals())
  1. <form action="" method="post">
  2. {% csrf_token %}
  3.  
  4. {% for field in form %}
  5. <div>
  6. <label for="">{{ field.label }}</label>
  7. {{ field }}
  8. </div>
  9. {% endfor %}
  10. <input type="submit" class="btn btn-default pull-right">
  11.  
  12. </form>

modelform用法

  1. class MenuModelForm(forms.ModelForm):
  2. class Meta:
  3. model = models.Menu
  4. fields = '__all__'
  5. widgets = {
  6. 'title': forms.TextInput(attrs={'placeholder': '请输入角色名称', 'class': 'form-control'}),
  7. 'icon': forms.RadioSelect(
  8. choices=ICON_LIST
  9. )
  10. }
  11. error_messages = {
  12. 'title': {
  13. 'required': '菜单名称不能为空',
  14. },
  15. 'icon': {
  16. 'required': '请选择图标',
  17. }
  18. }
  19.  
  20. def menu_add(request):
  21. """
  22. 添加菜单
  23. :param request:
  24. :return:
  25. """
  26. if request.method == 'GET':
  27. form = MenuModelForm()
  28. else:
  29. form = MenuModelForm(request.POST)
  30. if form.is_valid():
  31. print(form.data)
  32. form.save()
  33. return redirect(reverse('rbac:menu_list'))
  34. return render(request, 'rbac/menu_change.html', {'form': form})
  35.  
  36. def menu_edit(request, pk):
  37. """
  38. 编辑菜单
  39. :param request:
  40. :return:
  41. """
  42. obj = models.Menu.objects.filter(id=pk).first()
  43. if not obj:
  44. return HttpResponse('菜单不存在')
  45.  
  46. if request.method == 'GET':
  47. form = MenuModelForm(instance=obj)
  48. return render(request, 'rbac/menu_change.html', {'form': form})
  49.  
  50. form = MenuModelForm(request.POST, instance=obj)
  51. if form.is_valid():
  52. form.save()
  53. return redirect(reverse('rbac:menu_list'))
  1. <div class="luffy-container">
  2. <form class="form-horizontal" method="post" novalidate>
  3. {% csrf_token %}
  4. <div class="form-group">
  5. <label class="col-sm-2 control-label">菜单名称:</label>
  6. <div class="col-sm-6">
  7. {{ form.title }}
  8.  
  9. </div>
  10. <div class="col-sm-offset-1 col-sm-2">
  11. <input type="submit" value="保 存" class="btn btn-primary">
  12. </div>
  13. </div>
  14. <div class="form-group">
  15. <label class="col-sm-2 control-label">图标:</label>
  16. <div class="col-sm-7 icon-area">
  17. {{ form.icon }}
  18. </div>
  19. <div class="col-sm-3">
  20. <div>{{ form.title.errors.0 }}</div>
  21. <div>{{ form.icon.errors.0 }}</div>
  22. </div>
  23. </div>
  24.  
  25. </form>
  26. </div>

formset用法

  1. class MultiPermissionForm(forms.Form):
  2. id = forms.IntegerField(
  3. widget=forms.HiddenInput(),
  4. required=False
  5. )
  6. title = forms.CharField(
  7. widget=forms.TextInput(attrs={'class': "form-control"})
  8. )
  9. url = forms.CharField(
  10. widget=forms.TextInput(attrs={'class': "form-control"})
  11. )
  12. name = forms.CharField(
  13. widget=forms.TextInput(attrs={'class': "form-control"})
  14. )
  15. menu_id = forms.ChoiceField(
  16. choices=[(None, '-----')],
  17. widget=forms.Select(attrs={'class': "form-control"}),
  18. required=False,
  19.  
  20. )
  21.  
  22. pid_id = forms.ChoiceField(
  23. choices=[(None, '-----')],
  24. widget=forms.Select(attrs={'class': "form-control"}),
  25. required=False,
  26. )
  27.  
  28. def __init__(self, *args, **kwargs):
  29. super().__init__(*args, **kwargs)
  30. self.fields['menu_id'].choices += models.Menu.objects.values_list('id', 'title')
  31. self.fields['pid_id'].choices += models.Permission.objects.filter(pid__isnull=True).exclude(
  32. menu__isnull=True).values_list('id', 'title')
  33.  
  34. def clean_pid_id(self):
  35. menu = self.cleaned_data.get('menu_id')
  36. pid = self.cleaned_data.get('pid_id')
  37. if menu and pid:
  38. raise forms.ValidationError('菜单和根权限同时只能选择一个')
  39. return pid
  40.  
  41. def add(request):
  42. """
  43. 增加
  44. :param request:
  45. :return:
  46. """
  47. MultiPermissionFormSet = formset_factory(MultiPermissionForm, extra=0)
  48. if request.method == 'GET':
  49. form = MultiPermissionFormSet()
  50. return render(request,'list.html',{'form':form}
  51. form = MultiPermissionFormSet(request.post)
  52. if form.is_valid():
  53. return redict('url')
  54. else:
  55. .........
  56.  
  57. def edit(request):
  58. """
  59. 修改
  60. :param request:
  61. :return:
  62. """
  63. MultiPermissionFormSet = formset_factory(MultiPermissionForm, extra=0)
  64. if request.method == 'GET':
  65. form = MultiPermissionFormSet('数据')
  66. # formset是支持批量修改的所以 这里传入的数据一定要是可迭代对象,并且里面的
  67. 数据类型是字典或者对象
  68. return render(request,'list.html',{'form':form}
  69. form = MultiPermissionFormSet(request.post)
  70. if form.is_valid():
  71. return redict('url')
  72. else:
  73. .........
  1. <div class="luffy-container">
  2. <form method="post" action="?type=generate">
  3. {% csrf_token %}
  4. {{ form.management_form }}
  5. # 这里一定要记得写这一步
  6. <div class="panel panel-default">
  7. <!-- Default panel contents -->
  8. <div class="panel-heading">
  9. <i class="fa fa-binoculars" aria-hidden="true"></i> 待新建权限列表
  10. <button class="right btn btn-primary btn-xs" style="padding: 2px 8px;margin: -3px;">
  11. <i class="fa fa-save" aria-hidden="true"></i>
  12. 新建
  13. </button>
  14. </div>
  15. <div class="panel-body" style="color: #9d9d9d;">
  16. 注意:路由系统中自动发现且数据库中不存在的路由。
  17. </div>
  18.  
  19. <table class="table table-bordered">
  20. <thead>
  21. <tr>
  22. <th>序号</th>
  23. <th>名称</th>
  24. <th>URL</th>
  25. <th>别名</th>
  26. <th>所属菜单</th>
  27. <th>根权限</th>
  28. </tr>
  29. </thead>
  30. <tbody>
  31. {% for form in generate_formset %}
  32.  
  33. <tr>
  34. <td style="vertical-align: middle;">{{ forloop.counter }}</td>
  35. {% for field in form %} # 这里在渲染标签的时候一定要渲染 id这个标签 这个很重要不然会报错 这里是写了两个fou循环 所以自动渲染了id标签
  36. {% if forloop.first %}
  37. <td class="hide">
  38. {% else %}
  39. <td>
  40. {% endif %}
  41. {{ field }}<span style="color: firebrick;">{{ field.errors.0 }}</span>
  42. </td>
  43. {% endfor %}
  44. {% endfor %}
  45. </tbody>
  46. </table>
  47. </div>
  48. </form>

modelformset用法

  1. class StudyRecordModelForm(forms.ModelForm):
  2. class Meta:
  3. model = models.StudyRecord
  4. fields = ['student','record','score','homework_note']
  5.  
  6. def changelist_view(self,request):
  7. ccid = request.GET.get('ccid')
  8. model_formset_cls = modelformset_factory(models.StudyRecord,StudyRecordModelForm,extra=0)
  9. queryset = models.StudyRecord.objects.filter(course_record_id=ccid)
  10. if request.method == "GET":
  11. formset = model_formset_cls(queryset=queryset)
            # 这里UI定是个可迭代对象,因为modelformset是操作多表的,里面的数据类型可以为字典或者对象
  12. return render(request,'study_record.html',{'formset':formset})
  13.  
  14. formset = model_formset_cls(data=request.POST)
  15. print(request.POST)
  16. if formset.is_valid():
  17. formset.save()
  18. return redirect('/stark/crm/studyrecord/list/?ccid=%s' %ccid )
  19. return render(request, 'study_record.html', {'formset': formset})
  1. <div class="panel panel-default">
  2. <div class="panel-heading">学习记录</div>
  3. <div class="panel-body">
  4. <div style="width: 680px;margin: 0 auto;">
  5. <form method="post">
  6. {% csrf_token %}
  7. {{ formset.management_form }}
  8. # 这里一定要加这句代码
  9.  
  10. <table class="table table-bordered">
  11. <thead>
  12. <tr>
  13. <th>姓名</th>
  14. <th>考勤</th>
  15. <th>作业成绩</th>
  16. <th>作业评语</th>
  17. </tr>
  18. </thead>
  19. <tbody>
  20. {% for form in formset %}
  21. <tr>
  22. {{ form.id }}
  23. # 这里只写了一层for循环,所以手动写字段,必须把id字段写上
  24. <td>{{ form.instance.student }}</td>
  25. <td>{{ form.record }} {{ form.record.errors.0 }}</td>
  26. <td>{{ form.score }} {{ form.score.errors.0 }}</td>
  27. <td>{{ form.homework_note }} {{ form.homework_note.errors.0 }}</td>
  28. </tr>
  29. {% endfor %}
  30. </tbody>
  31. </table>
  32. <input type="submit" value="保存">
  33. </form>
  34. </div>
  35. </div>
  36. </div>

以上为这四种的区别和用法。

 
 
 

form modelform formset modelformset的各种用法的更多相关文章

  1. Django之路12——form modelform formset modelformset的各种用法

      首先上结论: form适用于对单个表单的操作,并且需要对每个字段的验证规则自定义. modelform:适用于对用户提交的单个表单操作,字段可以用model中的表的字段来作为验证规则,适用于快速的 ...

  2. django基础 -- 10.form , ModelForm ,modelformset

    一.生成页面可用的 HTML标签 1.form 所有内置字段 Field required=True, 是否允许为空 widget=None, HTML插件 label=None, 用于生成Label ...

  3. Model&Form&ModelForm拾遗

    Model&Form&ModelForm拾遗 一.Model&Form&ModelForm Model:用于用户请求数据的验证(针对性弱),但有强大的数据库操作 For ...

  4. form.Show()和form.ShowDialog()的区别、新建一个form和MessageBox.Show()的常见用法

    一:form.Show()和form.ShowDialog()的区别 a. 任何窗体(派生于基类Form的类),都可以以两种方式进行显示. //非模式窗体From qform=new Form();q ...

  5. Django Form ModelForm modelfromset

    forms 组件 Form 组件 form表单完成的事情 提供input可以提交数据 对提交的数据进行校验 提供错误提示 定义form组件 from django import forms class ...

  6. Django Form&ModelForm

    ModelForm: 首先导入所需模块 from django.forms import ModelFormfrom django.forms import widgets as form_widge ...

  7. form的submit与onsubmit的用法与区别

    发生顺序:onsubmit -> submit1.阻止表单提单:<script>function submitFun(){    //逻辑判断    return true; //允 ...

  8. Django组件(五) Django之ContentType组件

    基础使用 -contenttype组件 -django提供的一个快速连表操作的组件,可以追踪项目中所有的APP和model的对应关系,并记录在ContentType表中. 当我们的项目做数据迁移后,会 ...

  9. Django 用ModelForm批量保存form表单(非常实用的方法) mfor_verity项目

    1.先看一下 Model 非常多 from django.db import models from users.models import UserProfile # Create your mod ...

随机推荐

  1. Selenium(6)

    一.定位页面元素 1.高级定位:层级定位 思路:先定位到祖先节点,在定位该祖先节点范围内的子节点 2.高级定位:Xpath定位(重点) (1)Xpath定位:Xpath就是一个表达式,表示元素的路径, ...

  2. 异步消息处理机制相关面试问题-AsyncTask面试问题详解

    什么是AsyncTask: 它本质上是一个封装了线程池和handler的异步框架. AsyncTask的使用方法: 三个参数: 五个方法: AsyncTask的内部原理: AsyncTask的注意事项 ...

  3. 电脑同时安装了python2和python3后,随意切换版本并使用pip安装

    第一步: python2安装路径下python.exe重命名为python2.exe,python3安装路径下python.exe重命名为python3.exe; 第二步: 分别为python2.ex ...

  4. redis实现排行榜功能

    目录 加入排行榜 操作排行榜 redis的zset可以很方便地用来实现排行榜功能,下面简单介绍python如何使用redis实现排行榜功能 加入排行榜 获取redis实例 import redis m ...

  5. Newnode's NOI(P?)模拟赛 第二题 dp决策单调优化

    其实直接暴力O(n3)DP+O2O(n^3)DP+O_2O(n3)DP+O2​优化能过- CODE O(n3)O(n^3)O(n3) 先来个O(n3)O(n^3)O(n3)暴力DP(开了O2O_2O2 ...

  6. 强制数据类型转换之Number类型

    ㈠强制类型转换 1.定义:指将一个数据类型强制转换为其他的数据类型    类型转换主要指,将其他的数据类型,转换为String ,Number, Boolean ㈡将其他的数据类型转换为Number ...

  7. Python 爬虫十六式 - 第六式:JQuery的假兄弟-pyquery

    PyQuery:一个类似jquery的python库 学习一时爽,一直学习一直爽   Hello,大家好,我是 Connor,一个从无到有的技术小白.上一次我们说到了 BeautifulSoup 美味 ...

  8. .NET面试题系列(二十一)C#中Equals和==的比较

    序言 值类型的比较 ; ; Console.WriteLine("Equals和= =(等于号)的比较"); Console.WriteLine("i.Equals(j) ...

  9. JavaWeb_(Hibernate框架)使用c3p0与Dbutils开发用户注册功能

    使用c3p0与Dbutils开发用户注册功能: 用户在register.jsp表单成功后,页面跳转到login.html,数据库中会存放用户注册的信息 <%@ page language=&qu ...

  10. JavaWeb_(Struts2框架)拦截器interceptor

    此系列博文基于同一个项目已上传至github 传送门 JavaWeb_(Struts2框架)Struts创建Action的三种方式 传送门 JavaWeb_(Struts2框架)struts.xml核 ...