碰到了一个郁闷的问题,修改inlineformset时,全部删掉子表,再新增一行时,报错.

背景: 用django配合jq做动态表格,实现用js动态添加/删除行,并通过inlineformset更新到数据库.示例代码在这里:https://github.com/TommyU/dynamic_form/

重现步骤:

1. 新增一个待办事宜,并设置清单,如下:

2. submit

3. 回头修改(通过列表的update按钮进入),把以上数据全部清空(圈起来的),只留下最后一行空白行,提交.

然后报错了,如下

Environment:

Request Method: POST
Request URL: http://127.0.0.1:8000/todolist/update/14/

Django Version: 1.6.5
Python Version: 2.7.5
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'south',
 'eForm',
 'formset_test')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'django.middleware.locale.LocaleMiddleware')

Traceback:
File "C:\Python27\lib\site-packages\django\core\handlers\base.py" in get_response
  112.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Python27\lib\site-packages\django\views\generic\base.py" in view
  69.             return self.dispatch(request, *args, **kwargs)
File "C:\Python27\lib\site-packages\django\views\generic\base.py" in dispatch
  87.         return handler(request, *args, **kwargs)
File "C:\Python27\lib\site-packages\django\views\generic\edit.py" in post
  228.         return super(BaseUpdateView, self).post(request, *args, **kwargs)
File "C:\Python27\lib\site-packages\django\views\generic\edit.py" in post
  171.             return self.form_valid(form)
File "E:/workspace/django_test/mysite/mysite\formset_test\views.py" in form_valid
  31.         if iter_form.is_valid():
File "C:\Python27\lib\site-packages\django\forms\formsets.py" in is_valid
  292.         err = self.errors
File "C:\Python27\lib\site-packages\django\forms\formsets.py" in errors
  267.             self.full_clean()
File "C:\Python27\lib\site-packages\django\forms\formsets.py" in full_clean
  314.             form = self.forms[i]
File "C:\Python27\lib\site-packages\django\utils\functional.py" in __get__
  49.         res = instance.__dict__[self.func.__name__] = self.func(instance)
File "C:\Python27\lib\site-packages\django\forms\formsets.py" in forms
  133.         forms = [self._construct_form(i) for i in xrange(self.total_form_count())]
File "C:\Python27\lib\site-packages\django\forms\models.py" in _construct_form
  848.         form = super(BaseInlineFormSet, self)._construct_form(i, **kwargs)
File "C:\Python27\lib\site-packages\django\forms\models.py" in _construct_form
  567.                 connection=connections[self.get_queryset().db])
File "C:\Python27\lib\site-packages\django\db\models\fields\__init__.py" in get_db_prep_lookup
  387.             value = self.get_prep_lookup(lookup_type, value)
File "C:\Python27\lib\site-packages\django\db\models\fields\__init__.py" in get_prep_lookup
  369.             return self.get_prep_value(value)
File "C:\Python27\lib\site-packages\django\db\models\fields\__init__.py" in get_prep_value
  613.         return int(value)

Exception Type: ValueError at /todolist/update/14/
Exception Value: invalid literal for int() with base 10: ''

  

 post数据:

似乎一定要求子表必需有一行数据是原表的?

update对应的python代码如下:

class todo_listUpdateView(UpdateView):
    model = todo_list
    template_name = 'todo_list_create.html'
    success_url = '/todolist/'
    form_class = todo_listForm

    def get_context_data(self, **kwargs):
        context = super(todo_listUpdateView, self).get_context_data(**kwargs)
        if self.request.POST:
            context.update(item_form = todo_itemSet(self.request.POST))
        else:
            context.update(item_form = todo_itemSet(instance =todo_list.objects.get(pk = self.kwargs.get('pk',False))))
        return  context

    def form_valid(self, form):
        iter_form = todo_itemSet(self.request.POST,instance=self.object)
        if iter_form.is_valid():
            self.object = form.save()
            iter_form.instance = self.object
            iter_form.save()
            return HttpResponseRedirect(self.get_success_url())
        else:
            return self.render_to_response(self.get_context_data())

  

============================经过调试,分析,看文档===================

发现如果用js直接把数据行给remove掉,如果全部move了,会报错.(原因有待分析).

其实,对于inlineformset的更新操作,django有做一个很不错的设计,直接给标志位打标记即可,什么都不用处理.核心修改如下:

1. 从create模板中分离出update模板(因为js处理不同)

2. 将update模板的deleteForm函数修改为:

    function deleteForm(btn, prefix) {
        $(".delete_mark",$(btn).parent().parent()).children().attr("checked","checked")
        $(btn).parents('.item').hide();
        return false;
    }

 同时update模板添加标志位:

<p class="delete_mark">{{form.DELETE}}</p>

 py代码不用修改,就这么简单!(其实django都处理好了,有时间要分析下)

===============备注===================

重现以上bug的方法是将todo_listUpdateView的template_name修改为"todo_list_create.html",如下图所示:

django formset bug?的更多相关文章

  1. 为什么这么多Python框架

    原文:http://bitworking.org/news/Why_so_many_Python_web_frameworks BitWorking This is Joe Gregorio's wr ...

  2. Django升级1.9.6出现的中文本地化bug

    Error日志: Error opening file for reading: Permission denied ERROR Internal Server Error: / Traceback  ...

  3. “全能”选手—Django 1.10文档中文版Part1

    本文是博主翻译的Django1.10版本官方文档的第一部分,如时间充裕,争取一直翻译下去,经验不足,或有错漏,敬请指正. 另外对于公开文档进行翻译的版权问题不是很清楚,如有侵权请联系我! 另外,要转载 ...

  4. Django admin美化插件suit应用[原创]

    前言 由于比较懒,自己弄了一个用户验证,没有自己写后台,用了django自带的user认证,并通过admin直接进行管理,但默认的admin并不漂亮,于是使用了这个django-suit插件,效果对比 ...

  5. Python攻关之Django(一)

    课程简介: Django流程介绍 Django url Django view Django models Django template Django form Django admin (后台数据 ...

  6. 利用django创建一个投票网站(五)

    创建你的第一个 Django 项目, 第五部分 这一篇从第四部分(en)结尾的地方继续讲起.我们在前几章成功的构建了一个在线投票应用,在这一部分里我们将其创建一些自动化测试. 自动化测试简介 自动化测 ...

  7. Django基础,Day6 - 单元测试tests

    在django项目app目录下,有个tests.py,我们通常可以直接在这文件中写我们的单元测试代码. test for a model 根据前面章节的操作步骤下来,在Question Model中有 ...

  8. “全能”选手—Django 1.10文档中文版Part3

    Django 1.10官方文档的入门教程已经翻译完毕,后续的部分将不会按照顺序进行翻译,而是挑重点的先翻译. 有兴趣的可以关注我的博客. 第一部分传送门 第二部分传送门 第四部分传送门 3.2 模型和 ...

  9. Django 1.10 中文文档------3.2.1 模型Models

    3.2.1 models模型 通常一个模型映射一张单独的数据表. 基本概念: 每个model都是django.db.models.Model的子类 model的每个属性代表数据表的某一列 Django ...

随机推荐

  1. 龙哥库塔法or欧拉法求解微分方程matlab实现

    举例:分别用欧拉法和龙哥库塔法求解下面的微分方程 我们知道的欧拉法(Euler)"思想是用先前的差商近似代替倒数",直白一些的编程说法即:f(i+1)=f(i)+h*f(x,y)其 ...

  2. POJ 1151 Atlantis(线段树-扫描线,矩形面积并)

    题目链接:http://poj.org/problem?id=1151 题目大意:坐标轴上给你n个矩形, 问这n个矩形覆盖的面积 题目思路:矩形面积并. 代码如下: #include<stdio ...

  3. 腾讯bugly团队提供的android国内镜像

    腾讯bugly团队提供的国内镜像   如果使用Android SDK Manager下载比较慢或者打不开,可以使用国内镜像 使用说明 http://android-mirror.bugly.qq.co ...

  4. 深入理解Java虚拟机之读书笔记四 性能监控与故障处理工具

    JDK的bin目录下存在很多有效的命令行工具,它们就是jdk\lib\toos.jar类库的封装. 一.jps:虚拟机进程状况工具,查询出LVMID. 二.jstat:虚拟机统计信息监视工具, 三.j ...

  5. JAVA 堆栈知识和Volatile关键字

    栈内存:存放基本类型的变量和对象的引用 堆内存:存放用new创建的对象和数组 栈帧:保存了局部变量表,操作数栈,方法的返回地址以及其它的附加信息 volatile修饰的变量,jvm虚拟机只是保证从主内 ...

  6. Maven实战(六)--- dependencies与dependencyManagement的区别

    在上一个项目中遇到一些jar包冲突的问题,之后还有很多人分不清楚dependencies与dependencyManagement的区别,本篇文章将这些区别总结下来. 1.DepencyManagem ...

  7. 做一个聪明的.net程序员

    最近看了传智播客(http://net.itcast.cn/)的.net培训视频,感受颇深,忍不住要把感受写下来跟网友分享一下. 我从接触.net到现在已经至少过去了三五个年头,用.net也已经做了若 ...

  8. ExtJs4.1实现数据缓存

    Ext.onReady(function () {             Ext.define("ProvinceCity", {                 extend: ...

  9. mysql查询练习

    mysql> #查询每个栏目最贵的商品 mysql> select goods_id,shop_price,cat_id from (select goods_id,shop_price, ...

  10. 一起啃PRML - Preface 前言

    一起啃PRML - 前言 Preface @copyright 转载请注明出处 http://www.cnblogs.com/chxer/ PRML,Pattern Recognition and M ...