分享

django form表单

 天才白痴书馆 2015-04-14

app文件夹新建一个forms.py文件。

Python代码  收藏代码
  1. #coding=utf-8  
  2. from django import forms  
  3. #from django import newforms as forms 0.96  
  4.   
  5.   
  6. class CompanyIntroForm(forms.Form):  
  7.     company_name = forms.CharField(max_length=100)  
  8.     basic_intro = forms.CharField(widget=forms.Textarea(),required=False)#定义一个TEXTAREA模板,同时并不是必填项。  
  9.     main_business = forms.CharField(widget=forms.Textarea(),required=False)  
  10.     message = forms.CharField(widget=forms.Textarea())  
  11.   
  12. 读取则为:  
  13.    company_name = forms.cleaned_date['company_name']方式  

 

用这种方式还可以做自定义效验。比如想为charfield的字段添加额外的效验条件。

Python代码  收藏代码
  1. def clean_message(self):(0.96)  
  2.     message = self.clean_data.get('message', '')  
  3.     num_words = len(message.split())  
  4.     if num_words < 4:  
  5.         raise forms.ValidationError("Not enough words!")  
  6.     return message  

 

以上是常规方法

还有一种简便方法

可以直接从将models里的内容重定义到forms里,很方便。

Python代码  收藏代码
  1. #coding=utf-8  
  2. from models import CompanyIntro  
  3.   
  4. CompanyIntroForm = modelform_factory(CompanyIntro, fields=('name', 'title')) # fields指包含的元素。  
  5. 或  
  6. CompanyIntroForm = modelform_factory(CompanyIntro, exclude=('birth_date',)) #exclude指未包含的元素。  

  or

 

Python代码  收藏代码
  1. from django.forms import ModelForm  
  2.   
  3. #Create the form class.  
  4. class CompanyIntroForm(ModelForm):  
  5.     class Meta:  
  6.         model = CompanyIntro  

  

Python代码  收藏代码
  1. django默认的表单系统无法支持实例级别的Model权限控制, 例如字段的只读性和可见性. 花了不少时间研究, 找到如下的改进方法:   
  2.   
  3. #!/usr/bin/env python  
  4. # -*- coding: UTF-8 -*-  
  5.   
  6. from django.db import models  
  7. from django.forms import ModelForm  
  8.   
  9. class SpigModelForm(ModelForm):          
  10.     def __init__(self, hidden_fields=[], readonly_fields=[], *args, **kwargs):  
  11.       
  12.         super(SpigModelForm, self).__init__(*args, **kwargs)  
  13.             
  14.         if self.instance.id:  
  15.             #将需要隐藏的字段逐个从self.fields中删除, 这样这些字段就不会呈现给用户了.  
  16.             for field in hidden_fields:  
  17.                 del self.fields[field]  
  18.               
  19.             #设置浏览器端的只读属性      
  20.             for field in readonly_fields:  
  21.                 self.fields[field].widget.attrs['disabled'] = 'disabled'  
  22.                 setattr(self, 'clean_%s' % field, lambda : getattr(self.instance, field))  
  23.   
  24. 说明:  
  25. 要实现特定字段的隐藏, 只要在构造实例时将其从self.fields中删除即可.  
  26. 至于字段的只读, 则颇有点麻烦.  
  27. 首先需要控制浏览器端的只读性:  
  28. self.fields[field].widget.attrs['disabled'] = 'disabled'  
  29. 其次要在服务器端加上处理. 这里的做法是利用lambda表达式动态的为python实例增加clean方法. 例如对name字段, 则自动生成一个clean_name方法, 该方法什么也不做, 简单返回字段自身. 也就是说在做数据校验的时候, 如果一个字段被要求只读, 那么会把他原来的值赋给它, 达到无法修改的目的.代码不多, 但是十分有用.  
 

还有一个modelformset_factory 这个类跟modelform_factory差不多,具体差别有待多加验证。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多