django form表单
程序员文章站
2022-04-26 17:45:43
...
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差不多,具体差别有待多加验证。
上一篇: 爆囧,有逗B、二货和不着调
下一篇: 实例:组合继承及问题