今天遇到了一个奇怪的问题,django中formview一直返回200,但是却没有执行form_valid方法,然后在其中加了一个form_invalid方法:

class StudentRegisterMixin(generic.FormView):                                    
    def get_form_class(self):                                                      
                                                                                 
    def get_success_url(self):                                                           
                                                                                 
    def form_valid(self, form):

def form_invalid(self, form):                                                
        print "form is not valid, errors are: "                                  
        print form.errors                                                        
        return http.HttpResponse(form.errors)                                    
把这个错误打印出来,然后发现总是一个地区district的域有错误,经过检查,发现是前端传过来的数据是一个字符0,这样form验证的时候不会把它当作空,

而district的域定义是这样:

district = forms.ModelChoiceField(                                           
          required=False,                                                          
          queryset=core_models.District.objects.all(),                             
      )

也就是说他有一个queryset,这个queryset会根据前端传过来的值到数据库中去找,找到了才会把其加入到cleaned_data中

而django form验证的机制是,先调用clean()方法,得到cleaned_data,再调用clean_field方法,调用开发者对各个域附加的验证方法。。

而cleaned_data中没有的关键字是不会调用clean_field方法的。。。

这个错误找了老半天。。终于在stackoverflow和文档的帮助下解决了,解决方法是重写clean方法:

def clean(self):                                                             
          super(StudentCreationForm, self).clean()                                 
          print "cleaned_data is : ", self.cleaned_data                            
          if 'district' in self._errors:                                           
              del self._errors['district']                                         
              self.cleaned_data['district'] = None                                 
                                                                                   
          return self.cleaned_data

这样就可以忽略掉由于district而产生的错误了。

django的form验证机制的更多相关文章

  1. Django的Form验证(2)

    Django的Form验证(2) Form的含义及作用: 用于验证用户请求数据合法性的一个组件(校验数据的合法性) Django的Form实现步骤: 创建一个验证用户请求的模板 from django ...

  2. Django的Form验证

    Django的Form验证 Form验证:Form提交Form表单数据验证 针对Form提交的数据进行验证 创建模板 class loginForm() 请求提交给模板,创建对象 obj=loginF ...

  3. Django中Form验证

    Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 一,Form验证 第一种操作:主要是这三个函数 ...

  4. django 使用form验证用户名和密码

    form验证可以减少查询数据库,所以代码先预先验证,有问题可以返回给前端显示 1.在users文件夹下新建forms.py文件,用来验证用户名和密码是否为空,密码长度是否大于6 # -*- codin ...

  5. Django之Form验证

    view.py 配置 from django import forms from django.forms import fields # Create your views here. class ...

  6. Python Django的分页,Form验证,中间件

    本节内容 Django的分页 Form 中间件 1 Django 分页 1.1 Django自带的分页 1.首先来看下我的测试数据环境 ############ models.py ######### ...

  7. Django form验证

    # 模版 class LoginForm(forms.Form): # 模版中的元素 user = forms.CharField(min_length=6,error_messages={" ...

  8. [py][mx]django form验证-给db减压

    django form认证-解压db压力 一般系统都需要前后端都验证 前端验证容器逃逸破解,如通过js console口去发 试想如果后端只有db验证,那么前端无论发什么后端都查询一次db,对db压力 ...

  9. Django之Form、跨站请求以及cookie、session

    Form表单 常规html页面的form表单验证 常规页面中,如果想实现对表单中用户输入信息的数据验证,需要配合Ajax来实现. 使用前我们先来熟悉下函数参数:request,其中包含的意义: req ...

随机推荐

  1. 【计算机网络】Session机制

    1. Http请求中Session机制 先简单说一下HTTP请求中的Session机制:Session数据保存在服务器端,SessionID保存在客户端的Cookies中(关闭浏览器时过期).当客户端 ...

  2. Django中模板查找路径配置

  3. (转)UILabel常用属性

    Java代码 收藏代码 #import "ViewController.h" #import <CoreText/CoreText.h> @interface View ...

  4. 剑指Offer(书):树的子结构

    题目:输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 分析:关于二叉树大部分适应于递归结构. public boolean HasSubtree(TreeN ...

  5. cs229_part3

    接下来就是最最最重要的一个有监督学习算法了. 支持向量机 问题背景 样本集表示: \[(x,y)\in D, x\in R^n, y\in \{-1,+1\}\] 回到之前的逻辑回归模型中: 逻辑回归 ...

  6. Experimental considerations

    先知 重金属颗粒与气孔大小 气孔位置.密度与开合时间 角质层厚度 意外 叶子第二天掉落 样本没有放冰箱 高光谱仪器损坏 天气下雨/雪 仪器预约 楼顶/实验室门卡提前一天预约 光合仪提前一天预约 ASD ...

  7. HTML5 移动端web

    概述 HTML5 提供了很多新的功能,主要有: 新的 HTML 元素,例如 section, nav, header, footer, article 等 用于绘画的 Canvas 元素 用于多媒体播 ...

  8. kali-xfce的简单配置

    1.更新 设置kali的更新源 在终端中打开sources.list root@kali:~# vim /etc/apt/sources.list 删除里面的注释,清空. 然后输入下面的更新源地址: ...

  9. python3--__repr_和__str__会返回字符串表达形式

    __repr_和__str__会返回字符串表达形式 下一个例子是已经见过的init构造方法和add重载方法,本例也会定义返回实例的字符串表达形式的__repr__方法.字符串格式把self.data对 ...

  10. Codeforces Round #432 (Div. 2, based on IndiaHacks Final Round 2017)

    昨晚打得小号,虽然很菜,可是还是涨了些rating A. Arpa and a research in Mexican wave time limit per test 1 second memory ...