zoukankan      html  css  js  c++  java
  • django的form验证机制

    今天遇到了一个奇怪的问题,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而产生的错误了。

  • 相关阅读:
    sql server 笔记(数据类型/新建、修改、删除数据表/)
    在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: Nam
    jquery 操作 checkbox select
    layui常见问题
    Sublime Text 3下载-汉化-插件配置
    CSS前端开发学习总结、一
    如何用 JavaScript 下载文件
    腾讯大王卡、天王卡代申请
    新人报道~cnblogs
    Node.js
  • 原文地址:https://www.cnblogs.com/andy071001/p/3154683.html
Copyright © 2011-2022 走看看