基于model的form表单

Django 提供一个辅助类来让你可以从Django 的模型创建表单。生成的表单类中将具有和指定的模型字段对应的表单字段,顺序为fields 属性中指定的顺序。

ForeignKey 和 ManyToManyField 字段类型

ForeignKey 表示成django.forms.ModelChoiceField,它是一个ChoiceField,其选项是模型的查询集。
ManyToManyField 表示成django.forms.ModelMultipleChoiceField,它是一个MultipleChoiceField,其选项是模型的查询集。

生成的每个表单字段都有以下属性集

模型字段设置blank=True,则required=True。
表单字段的label 设置为模型字段的verbose_name,并将第一个字母大写。
表单字段的help_text 设置为模型字段的help_text。
如果模型字段设置了choices,那么表单字段的Widget 将设置成Select,其选项来自模型字段的choices。选项通常会包含空选项,并且会默认选择。如果字段是必选的,它会强制用户选择一个选项。如果模型字段的blank=False 且具有一个显示的default 值,将不会包含空选项(初始将选择default 值)。

示例

model

from django.db import models
TITLE_CHOICES = (
    (‘MR‘, ‘Mr.‘),
    (‘MRS‘, ‘Mrs.‘),
    (‘MS‘, ‘Ms.‘),
)
class Author(models.Model):
    name = models.CharField(max_length=100)
    title = models.CharField(max_length=3, choices=TITLE_CHOICES)
    birth_date = models.DateField(blank=True, null=True)
class Book(models.Model):
    name = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)

forms.py

from django.forms import ModelForm, Textarea
from django.utils.translation import ugettext_lazy as _
from django.core.exceptions import ValidationError
from model_form.models import Author
def validate_begins(value):
    """自定义验证器"""
    if not value.startswith(u‘new‘):
        raise ValidationError(u‘字符串必须是 `new` 开头‘)
class AuthorForm(ModelForm):
    # 使用自定义的字段
    # name = MyFormField(max_length=200, required=False, validators=[validate_slug]
    def __init__(self, *args, **kwargs):
        print("执行顺序1:init")
        # 自定义ModelForm中的field验证规则
        super(AuthorForm, self).__init__(*args,**kwargs)
        self.fields[‘name‘].required = True
        self.fields[‘city‘].validators.append(validate_begins)
    def clean_name(self):
        """自定义验证方法"""
        print("执行顺序2:clean_name")
        value = self.cleaned_data[‘name‘]
        if value == ‘root‘:
            return value
        else:
            raise ValidationError("你不是管理员!")
    def clean(self):
        print("执行顺序3: name")
        # 不符合需求的字段不会出现在cleaned_data中
        cleaned_data = super(AuthorForm, self).clean()
        password = cleaned_data.get(‘password‘, ‘‘)
        password2 = cleaned_data.get(‘password2‘, ‘‘)
        if password != password2:
            raise forms.ValidationError("passwords not match")
        return cleaned_data
    class Meta:
        print("启动Django时就执行了")
        model = Author

        # fields = ‘__all__‘  # 显示全部字段
        # exclude = ‘title‘   # 排除某个字段
        fields = [‘name‘, ‘title‘, ‘city‘,]  # 决定显示哪些字段与显示顺序
        # model中指定editable=False时,任何表单都不会包含该字段。
        labels = {‘name‘: _(‘姓名‘),}
        help_texts = {‘name‘: _(‘Some useful help text.‘),}
        error_messages = {
            ‘name‘: {‘required‘: _("This writer‘s name is too long."),},
            ‘birth_date‘: {‘required‘: _("时间不能为空"),},
        }
时间: 2024-10-16 03:38:17

基于model的form表单的相关文章

sharepoint 2013基于AD的Form表单登录(二)——form登录页面自定义

配置好了sharepoint 2013基于AD的Form登录,只是成功了第一步,如何自定义登录页呢?特别是不要出现sharepoint2013自带登录页面,每次登录前还需要选择是否是form或者windows验证. 打开vs2012新建sharepoint 2013 project,在layouts目录下添加application page,页面命名为CustomLogin.aspx. 前台页面:为避免母版页中其他控件影响,注意继承的是simple.master         后台页面:继承F

sharepoint 2013基于AD的Form表单登录(四)——开发自定义登录过程需要引用文件路径。

1.Microsoft.IdentityModel.dll 位置 %ProgramFiles%\ReferenceAssemblies\Windows Identity Foundation\v3.5 2.Microsoft.SharePoint.IdentityModel.dll位置 C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.SharePoint.IdentityModel\v4.0_15.0.0.0__71e9bce111e94

sharepoint 2013基于AD的Form表单登录(三)——选择用户时,屏蔽掉AD。

//来源:http://www.cnblogs.com/lrforever/p/3695820.html 隐藏AD人员选择,$ad.IsVisible设置为true,则显示出AD里用户 $cpm = Get-SPClaimProviderManager  $ad = get-spclaimprovider -identity "AD" $ad.IsVisible = $false $cpm.Update()

Extjs的form表单自动装载数据(通过Ext.data.Model的代理加载数据)

在做项目的时候遇到一个问题,以前双击grid页面一行数据的时候,会吧双击这一行的数据自动加载到双击的页面(Ext的弹出框),可以通过this.down(''form).getForm().loadRecord(record)来自动加载,可是现在有一个需求就是双击grid一行弹出一个新的浏览器页面(不是ext的弹出框,通过window.open()实现),只能把双击的id传到页面,再重新查数据手动赋值,如果一个页面字段很多,一个一个赋值是很辛苦的,所以就想能不能自动装载数据 通过长时间研究发现,t

9.16 基于form表单的文件上传实现 ContextType

基于form表单传递普通键值对的方式传递数据: enctype="application/x-ww-form-urlencoded" 基于form表单上传文件 传递数据,非键值对: enctype="multipart/form-data" enctype="text/plain" 这种方式几乎不用 基于ajax传递普通键值对的方式传递数据到服务器 只要请求体有数据,request.body都有值 .但request.post 只有当conten

django 基于form表单上传文件和基于ajax上传文件

一.基于form表单上传文件 1.html里是有一个input type="file" 和 'submit'的标签 2.vies.py def fileupload(request): if request.method == 'POST': print(request.POST) print(request.FILES) # from django.core.files.uploadedfile import InMemoryUploadedFile print(type(reque

jQuery实现form表单基于ajax无刷新提交方法详解

本文实例讲述了jQuery实现form表单基于ajax无刷新提交方法.分享给大家供大家参考,具体如下: 首先,新建Login.html页面: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.o

基于Bootstrap+jQuery.validate Form表单验证实践

项目结构 : github 上源码地址:https://github.com/starzou/front-end-example    点击打开 1.form 表单代码 [html] view plaincopy <!DOCTYPE html> <html> <head> <title>Bootstrap Form Template</title> <meta charset="utf-8" /> <meta

ajax上传文件 基于jquery form表单上传文件

<script src="/static/js/jquery.js"></script><script> $("#reg-btn").click(function () { // 1. 取到用户填写的数据 var form_data_obj = new FormData(); form_data_obj.append('username',$('#id_username').val()); form_data_obj.append