app文件夹新建一个forms.py文件。
- #coding=utf-8
- from django import forms
- #from django import newforms as forms 0.96
-
-
- class CompanyIntroForm(forms.Form):
- company_name = forms.CharField(max_length=100)
- basic_intro = forms.CharField(widget=forms.Textarea(),required=False)#定义一个TEXTAREA模板,同时并不是必填项。
- main_business = forms.CharField(widget=forms.Textarea(),required=False)
- message = forms.CharField(widget=forms.Textarea())
-
- 读取则为:
- company_name = forms.cleaned_date['company_name']方式
用这种方式还可以做自定义效验。比如想为charfield的字段添加额外的效验条件。
- def clean_message(self):(0.96)
- message = self.clean_data.get('message', '')
- num_words = len(message.split())
- if num_words < 4:
- raise forms.ValidationError("Not enough words!")
- return message
以上是常规方法
还有一种简便方法
可以直接从将models里的内容重定义到forms里,很方便。
- #coding=utf-8
- from models import CompanyIntro
-
- CompanyIntroForm = modelform_factory(CompanyIntro, fields=('name', 'title')) # fields指包含的元素。
- 或
- CompanyIntroForm = modelform_factory(CompanyIntro, exclude=('birth_date',)) #exclude指未包含的元素。
or
- from django.forms import ModelForm
-
- #Create the form class.
- class CompanyIntroForm(ModelForm):
- class Meta:
- model = CompanyIntro
- django默认的表单系统无法支持实例级别的Model权限控制, 例如字段的只读性和可见性. 花了不少时间研究, 找到如下的改进方法:
-
- #!/usr/bin/env python
- # -*- coding: UTF-8 -*-
-
- from django.db import models
- from django.forms import ModelForm
-
- class SpigModelForm(ModelForm):
- def __init__(self, hidden_fields=[], readonly_fields=[], *args, **kwargs):
-
- super(SpigModelForm, self).__init__(*args, **kwargs)
-
- if self.instance.id:
- #将需要隐藏的字段逐个从self.fields中删除, 这样这些字段就不会呈现给用户了.
- for field in hidden_fields:
- del self.fields[field]
-
- #设置浏览器端的只读属性
- for field in readonly_fields:
- self.fields[field].widget.attrs['disabled'] = 'disabled'
- setattr(self, 'clean_%s' % field, lambda : getattr(self.instance, field))
-
- 说明:
- 要实现特定字段的隐藏, 只要在构造实例时将其从self.fields中删除即可.
- 至于字段的只读, 则颇有点麻烦.
- 首先需要控制浏览器端的只读性:
- self.fields[field].widget.attrs['disabled'] = 'disabled'
- 其次要在服务器端加上处理. 这里的做法是利用lambda表达式动态的为python实例增加clean方法. 例如对name字段, 则自动生成一个clean_name方法, 该方法什么也不做, 简单返回字段自身. 也就是说在做数据校验的时候, 如果一个字段被要求只读, 那么会把他原来的值赋给它, 达到无法修改的目的.代码不多, 但是十分有用.
还有一个modelformset_factory 这个类跟modelform_factory差不多,具体差别有待多加验证。
|