今天遇到了一个奇怪的问题,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. 纯 CSS 创作一个表达怀念童年心情的条纹彩虹心特效

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/QxbmxJ 可交互视频教 ...

  2. iOS使用Reveal分析他人app界面

    本文转自http://blog.csdn.net/cuibo1123/article/details/45694657 安装: 首先前往 http://revealapp.com/download/  ...

  3. PAT Basic 1019

    1019 数字黑洞 给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到一个新的数字.一直重复这样做,我们很快会停在有“数字 ...

  4. apk 解包 打包

    APK应用程序的解包.修改.编辑.汉化.打包及应用 前两讲主要讲玩机的最基本的知识,集中在如何刷机.本讲是进级的内容,来谈谈与apk应用程序有关的知识,内容包括akp文件的解包.打包.反编辑.解析.汉 ...

  5. linux查找和替换命令

    http://blog.csdn.net/imyang2007/article/details/8105499 命令的东西应该多练,熟能生巧.

  6. Exchange 正版化 授权

    网友说法: Exchange服务器版其实价格不高,企业版也就是几万左右,贵的是客户端授权,一个客户端授权大概要300多.但是,但是,中国企业买Exchange客户端一般都是可以按比例买的,比如10%- ...

  7. 【02】[].slice和Array.prototype.slice

    [02][].slice和Array.prototype.slice 01,Array是一个构造函数.浏览器内置的特殊对象.   02,Array没有slice方法. 03,Array.prototy ...

  8. luogu1879 [USACO06NOV]玉米田Corn Fields

    学习位运算 #include <iostream> #include <cstdio> using namespace std; int n, m, dp[15][4105], ...

  9. Sort a linked list in O(n log n) time using constant space complexity.

    因为题目要求复杂度为O(nlogn),故可以考虑归并排序的思想. 归并排序的一般步骤为: 1)将待排序数组(链表)取中点并一分为二: 2)递归地对左半部分进行归并排序: 3)递归地对右半部分进行归并排 ...

  10. [android开发篇]elicpse安装教程

    http://www.runoob.com/eclipse/eclipse-install.html Eclipse 安装(Neon 版本) Eclipse 最新版本 Eclipse Neon,这个首 ...