我们以前接触过Form组件就是堆你的字段进行校验的  现在我来看看ModelForm

ModelForm比你的Form方便了一万倍

from django import forms

生成form类

class RoleForms(forms.ModelForm):
class Meta:
model = models.Role # 选择要对你的哪个表进行操作
fields = "__all__" # 选择字段
widgets = { # 给你的表中的字段增加属性
"title":forms.TextInput(attrs = {"class":"form-control"}), # 对你的字段进行设定 }
error_messages = { # 添加额外的信息
"name" : {
"required":"用户名不能为空"
}
}
def roles_edit(request,pk,*args,**kwargs):
role_obj = models.Role.objects.filter(pk = pk).first()
if request.method == "GET":
form = RoleForms(instance=role_obj) #实例化你的form类 如果有参数就用到instance 没有则不传递 else:
form = RoleForms(request.POST,instance=role_obj)
if form.is_valid(): # 和form一样完成之后执行这个
form.save() # 同form组件 return redirect("/rbac/role_list/") return render(request,"rbac/roles_add.html",{"form":form})

modelForm也可以定义钩子函数就和form组件的定义一样的

class MultiPermissionForm(forms.Form):
id = forms.IntegerField(
widget=forms.HiddenInput(),
required=False
)
title = forms.CharField(
widget=forms.TextInput(attrs={'class': "form-control"})
)
url = forms.CharField(
widget=forms.TextInput(attrs={'class': "form-control"})
)
name = forms.CharField(
widget=forms.TextInput(attrs={'class': "form-control"})
)
menu_id = forms.ChoiceField(
choices=[(None, '-----')],
widget=forms.Select(attrs={'class': "form-control"}),
required=False, ) pid_id = forms.ChoiceField(
choices=[(None, '-----')],
widget=forms.Select(attrs={'class': "form-control"}),
required=False,
) def __init__(self, *args, **kwargs): #定义钩子函数
super().__init__(*args, **kwargs)
self.fields['menu_id'].choices += models.Menu.objects.values_list('id', 'title')
self.fields['pid_id'].choices += models.Permission.objects.filter(pid__isnull=True).exclude(
menu__isnull=True).values_list('id', 'title') def clean_pid_id(self): #定义全局钩子
menu = self.cleaned_data.get('menu_id')
pid = self.cleaned_data.get('pid_id')
if menu and pid:
raise forms.ValidationError('菜单和根权限同时只能选择一个')
return pid

formset

以前我们使用的form表单只能一个个的在提交信息什么的 ,现在我们可以在后台使用formset然后动态生成自己想要的多行信息

先导入信息:

from django.forms import formset_factory

当你的后台想要的table表格可以随着你的设定而增加,而不用再后台一个一个输入

def multi_permissions(request):
"""
批量操作权限
:param request:
:return:
"""
post_type = request.GET.get('type') MultiPermissionFormSet = formset_factory(MultiPermissionForm, extra=0) 实例化你的formset_factory 然后把你的定义的modelForm的类传递进去
generate_formset = None
update_formset = None if request.method == 'POST' and post_type == 'generate':
formset = MultiPermissionFormSet(request.POST) # 然后对你的formset对象再次进行请求类型的判断
if not formset.is_valid():
generate_formset = formset
else:
for row_dict in formset.cleaned_data: 如果不是正确的
row_dict.pop('id')
models.Permission.objects.create(**row_dict) if request.method == 'POST' and post_type == 'update':
formset = MultiPermissionFormSet(request.POST)
if formset.is_valid():
for row_dict in formset.cleaned_data:
permission_id = row_dict.pop('id')
models.Permission.objects.filter(id=permission_id).update(**row_dict)
else:
update_formset = formset

MdelForm 和formset的更多相关文章

  1. Django formset

    一 什么是formset Form组件或ModelForm用于做一个表单验证而formset是用于做多个表单的验证组件,用于做批量操作 二 formset的使用方法 1 设置form信息 class ...

  2. python 全栈开发,Day111(客户管理之 编辑权限(二),Django表单集合Formset,ORM之limit_choices_to,构造家族结构)

    昨日内容回顾 1. 权限系统的流程? 2. 权限的表有几个? 3. 技术点 中间件 session orm - 去重 - 去空 inclusion_tag filter 有序字典 settings配置 ...

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

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

  4. rbac 权限分配, 基于formset实现,批量编辑

    已经完成了  批量添加的功能. 还想要一个批量修改的功能了.随之而来的第一个问题就是,  我们的formset 并不是一条记录.而是 多条记录,甚至整个表的记录.那么显而易见的问题就是,当前端页面把数 ...

  5. rbac 权限分配, 基于formset实现,批量增加

    这里需要两个知识点: - formset - 自动发现项目中的URL1. 什么是formset: Django中 form组件 或 ModelForm组件,用于做一个表单的验证. 接收前端form表单 ...

  6. formset批量处理form表单数据

    Formset(表单集)是多个表单的集合.Formset在Web开发中应用很普遍,它可以让用户在同一个页面上提交多张表单,一键添加多个数据 class StudentStudyRecordModel( ...

  7. 权限组件(11):基于formset实现批量增加

    效果图: 增加页面: 编辑页面: 因为后面要对权限进行批量操作,所以先用这个示例演示下如何实现批量操作 数据库 from django.db import models class Menu(mode ...

  8. Django表单集合----Formset

    概述:Formset(表单集)是多个表单的集合.Formset在Web开发中应用很普遍,它可以让用户在同一个页面上提交多张表单,一键添加多个数据,比如一个页面上添加多个用户信息,下面将会详细讲述如何使 ...

  9. formset的简单使用

    1.modelform class StudentStudyRecordModelForm(forms.ModelForm): class Meta: model = StudentStudyReco ...

随机推荐

  1. Go语言学习笔记十二: 范围(Range)

    Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...

  2. TemplateBinding和Binding的区别

    定义 TemplateBinding是为了某个特定场景优化出来的数据绑定版本--需要把ControlTemplate里面的某个Property绑定到应用该ControlTemplate的控件的对应Pr ...

  3. 05-python中的异常

    python的所有的异常都继承自基类: Exception 处理方式和java类似: path = raw_input('input the path') array = path.split('/' ...

  4. AI小白快上车!这是发往高薪职位的车!

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云AI中心发表于云+社区专栏 AI到底有多火?看看下面这组数据: 腾讯研究院<2017全球人工智能人才白皮书>报告中提 ...

  5. 精度更高的double类型计算工具类(借助BigDecimal类型)

    /** * 提供精確的加法運算 * @param args */ public static double add(double v1, double v2) { BigDecimal b1 = ne ...

  6. 使用 Selenium 实现基于 Web 的自动化测试

    (转自http://www.ibm.com/developerworks/cn/web/1209_caimin_seleniumweb/index.html) Selenium 是一个用于 Web 应 ...

  7. Extjs相关知识点梳理

      store是一个为Ext器件提供record对象的存储容器,行为和属性都很象数据表 方法:不列举继承来的方法 Store( Object config ) 构造,config定义为{ autoLo ...

  8. 手机端 : js设置table内容 加载更多,并头部锁定悬浮

     <script src="js/jquery.min.js" type="text/javascript"></script> < ...

  9. 【原】Spring activiti 环境搭建之数据库创建

    由于在开发工作流的时候,避免不了要保存一些数据和流程走向;所以在搭建Spring activiti开发环境的时候需要把官方提供的23张表创建到我们的DB,后续的流程都会在这些表中记录. 1.创建代码如 ...

  10. npm saveError ENOENT: no such file or directory

    1.报错情况 在执行npm install xxx时,出现如下:npm WARN saveError ENOENT: no such file or directory, open '/nodetes ...