DJANGO MODEL FORMSETS IN DETAIL AND THEIR ADVANCED USAGE
Similar to the regular formsets, Django also provides model formset that makes it easy to work with Django models. Django model formsets provide a way to edit or create multiple model instances within a single form. Model Formsets are created by a factory method. The default factory method is modelformset_factory(). It wraps formset factory to model forms. We can also create inlineformset_factory() to edit related objects. inlineformset_factory wraps modelformset_factory to restrict the queryset and set the initial data to the instance’s related objects.
Step1: Create model in models.py
- class User(models.Model):
- first_name = models.CharField(max_length=150)
- last_name = models.CharField(max_length=150)
- user_group = models.ForeignKey(Group)
- birth_date = models.DateField(blank=True, null=True)
Step2: in forms.py
- from django.forms.models import modelformset_factory
- from myapp.models import User
- UserFormSet = modelformset_factory(User, exclude=())
This will create formset which is capable of working with data associated with User model. We can also pass the queryset data to model formset so that it can do the changes to the given queryset only.
- formset = UserFormSet(queryset=User.objects.filter(first_name__startswith='M'))
We can produce an extra form in the template by passing 'extra' argument to the modelformset_factory method, we can use this as follows.
- UserFormSet = modelformset_factory(User, exclude=(), extra=1)
We can customize the form that will be displayed in the template by passing the new customized form to modelformset_factory. For eg: in our current example if want birth_date as date picker widget then we can achieve this with the following change in our forms.py.
- class UserForm(forms.ModelForm):
- birth_date = forms.DateField(widget=DateTimePicker(options={"format": "YYYY-MM-DD", "pickSeconds": False}))
- class Meta:
- model = User
- exclude = ()
- UserFormSet = modelformset_factory(User, form=UserForm)
In general Django's model formsets do validation when at least one from data is filled, in most of the cases there we'll be needing a scenario where we require at least one object data to be added or another scenario where we'd be required to pass some initial data to form, we can achieve this kind of cases by overriding basemodelformset as following,
in forms.py
- class UserForm(forms.ModelForm):
- birth_date = forms.DateField(widget=DateTimePicker(options={"format": "YYYY-MM-DD", "pickSeconds": False}))
- class Meta:
- model = User
- exclude = ()
- def __init__(self, *args, **kwargs):
- self.businessprofile_id = kwargs.pop('businessprofile_id')
- super(UserForm, self).__init__(*args, **kwargs)
- self.fields['user_group'].queryset = Group.objects.filter(business_profile_id = self.businessprofile_id)
- BaseUserFormSet = modelformset_factory(User, form=UserForm, extra=1, can_delete=True)
- class UserFormSet(BaseUserFormSet):
- def __init__(self, *args, **kwargs):
- # create a user attribute and take it out from kwargs
- # so it doesn't messes up with the other formset kwargs
- self.businessprofile_id = kwargs.pop('businessprofile_id')
- super(UserFormSet, self).__init__(*args, **kwargs)
- for form in self.forms:
- form.empty_permitted = False
- def _construct_form(self, *args, **kwargs):
- # inject user in each form on the formset
- kwargs['businessprofile_id'] = self.businessprofile_id
- return super(UserFormSet, self)._construct_form(*args, **kwargs)
Step3: in views.py
- from myapp.forms import UserFormSet
- from django.shortcuts import render_to_response
- def manage_users(request):
- if request.method == 'POST':
- formset = UserFormSet(businessprofile_id=businessprofileid, data=request.POST)
- if formset.is_valid():
- formset.save()
- # do something
- else:
- formset = UserFormSet(businessprofile_id=businessprofileid)
- return render_to_response("manage_users.html", {"formset": formset})
Step4: in template
The simplest way to render your formset is as follows.
- <form method="post" action="">
- {{ formset }}
- </form>
DJANGO MODEL FORMSETS IN DETAIL AND THEIR ADVANCED USAGE的更多相关文章
- Django model总结(上)
Django model是django框架中处于比较核心的一个部位,准备分三个博客从不同的方面分别进行阐述,本文为<上篇>,主要对[a]Model的基本流程,比如它的创建,迁移等:默认行为 ...
- 【转】Django Model field reference学习总结
Django Model field reference学习总结(一) 本文档包含所有字段选项(field options)的内部细节和Django已经提供的field types. Field 选项 ...
- Django model字段类型清单
转载:<Django model字段类型清单> Django 通过 models 实现数据库的创建.修改.删除等操作,本文为模型中一般常用的类型的清单,便于查询和使用: AutoField ...
- Django:Model的Filter
转自:http://www.douban.com/note/301166150/ django model filter 条件过滤,及多表连接查询.反向查询,某字段的distinct 1.多表 ...
- Django model中 双向关联问题,求帮助
Django model中 双向关联问题,求帮助 - 开源中国社区 Django model中 双向关联问题,求帮助
- django 自定用户系统 以及 Django Model 定义语法
http://www.tuicool.com/articles/jMzIr2 django使用自己的用户系统 http://www.jianshu.com/p/c10be59aad7a Django ...
- tornado with MySQL, torndb, django model, SQLAlchemy ==> JSON dumped
现在,我们用torndo做web开发框架,用他内部机制来处理HTTP请求.传说中的非阻塞式服务. 整来整去,可谓之一波三折.可是,无论怎么样,算是被我做成功了. 在tornado服务上,采用三种数据库 ...
- Django Model field reference
===================== Model field reference ===================== .. module:: django.db.models.field ...
- Django model对象接口
Django model查询 # 直接获取表对应字段的值,列表嵌元组形式返回 Entry.objects.values_list('id', 'headline') #<QuerySet [(1 ...
随机推荐
- h5css3_01
一.什么是 HTML5 HTML5 的概念与定义 定义:HTML5 定义了 HTML 标准的最新版本,是对 HTML 的第五次重大修改,号称下一代的 HTML 两个概念: 是一个新版本的 HTML 语 ...
- php内置函数,时间函数,字符串函数
字符数----某一种编码下的一个文字 字节数----8位的0或1或者混合组成:显然字节占的空间大,显然一个字符至少占有一个字节,中文在utf-8至少占用3个也有可能4个字节 由上图可见,substr( ...
- Python&R:警告信息管理
计算机程序有时很人性化,比如给你警告提示信息: 计算机程序有时又非常不人性化,比如动不动就给你警告提示...... 如果你的程序是要给客户使用,有运行美化要求: 再尤其是比如警告出现在循环里的情况,那 ...
- SQL server 大量数据导入和系统运行慢的问题
1.日常排查语句 --当前正在执行的语句 SELECT der.[session_id],der.[blocking_session_id], sp.lastwaittype,sp.hostname, ...
- 写在centos7 最小化安装之后
1.最小化安装之后首先解决联网问题(https://lintut.com/how-to-setup-network-after-rhelcentos-7-minimal-installation/) ...
- mysql ef vs
https://www.cnblogs.com/dux2013/archive/2017/12/11/8025077.html
- linux查看网关
Linux下查看网关方法:route -n ip route show traceroute www.prudentwoo.com -s 100 第一行就是自己的默认网关 netstat -r mor ...
- (Java多线程系列一)快速入门
Java多线程快速入门 1.线程和进程的区别 进程是所有线程的集合,每一个线程是进程的一条执行路径. 2.多线程的应用场景 多线程主要体现在提高程序的效率,比如迅雷多线程下载,多线程分批发送短信等. ...
- 12.Python数值类型(整形、浮点型和复数)及其用法
实际开发中,我们经常需要使用数字记录游戏中用户的得分.游戏中角色的生命值.伤害值等信息,Python 语言提供了数值类型用于保存这些数值. 需要注意的是,Python 中这些数值类型都是不可改变的,也 ...
- R_Studio(学生成绩)使用主成分分析实现属性规约
对11_1_4.csv成绩表进行主成分分析处理 setwd('D:\\data') list.files() #读取数据 dat=read.csv(file="11_1_4.csv" ...