欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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差不多,具体差别有待多加验证。
相关标签: Django