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框架中,表单(Form)是处理用户数据的核心工具,特别是在处理文件上传时。本教程将深入探讨如何使用Django Forms来实现文件上传功能。 首先,我们需要了解Django Form的基本结构。在Django中,创建一个...
在Python的Web开发框架Django中,Form表单验证是一个至关重要的部分,它允许开发者创建用户界面并确保从用户那里接收到的数据是有效且安全的。Form类是Django提供的一个强大工具,用于处理HTTP请求中的数据,进行...
在Python的Web开发框架Django中,Form表单是处理用户输入数据的重要工具。它不仅提供了数据验证功能,还能帮助我们构建美观的HTML表单。本教程将详细讲解Django的Form表单验证以及如何结合Ajax实现无刷新验证。 ...
【Python3 Django Form表单系统详解】 在Python3的Django框架中,Form表单系统是处理用户输入数据的关键组件,它提供了强大的功能,包括HTML表单的生成、数据验证以及错误信息的显示。以下是对Form组件的深入解析:...
**二、Django Form表单验证的应用** 1. 创建自定义表单类 在Django的某个应用中(如`app01`),创建一个名为`forms.py`的文件,定义一个继承自`forms.Form`的类,例如`RegisterForm`,并添加字段及验证规则: ```...
在Django中,Form是处理用户输入数据的重要工具,它允许开发者自定义表单的结构、验证规则以及渲染方式。本篇文章将详细讲解如何在Django Form中自定义`ChoiceField`,使其下拉菜单的选项从数据库中动态获取。 首先...
在Django框架中,表单(forms)是处理用户输入数据的重要工具,它简化了前后端交互的过程。本文将深入探讨如何在Django forms中创建一个包含`select`下拉框的表单,并且理解其传值机制。 首先,我们需要在`forms.py...
Django框架中的表单(form)与请求的生命周期是理解Web应用处理用户输入和响应过程的关键部分。在Django中,表单是用来处理用户输入、验证数据和展示错误的重要工具,而请求的生命周期则描述了从用户发起请求到...
`django-formapi` 是一个用于 Django 框架的库,它使得开发者能够快速、方便地为 Django 表单验证创建符合 JSONAPI 规范的 RESTful API。这个库的目标是简化处理表单数据的过程,尤其是当你的应用需要通过 API 接收...
在Django框架中,Form是处理用户输入数据的重要工具,它简化了模型与视图之间的交互,使得数据验证和处理更加高效。本教程基于Django 1.6和Python 2.7.6,将详细介绍如何利用Form实现注册、登录、注销以及修改密码...
django的form表单,也可用可不要, 在views里创建一个类,继承了forms.Form ,每个字段就是一个输入框, #----- #django 的form表单 from django import forms class MyForm(forms.Form): #forms对应的是前端的form...
在Django中,form表单通常用于用户输入数据并提交到服务器进行处理。当你在form表单中设置了`action`属性,它会指定表单数据提交的目标URL。然而,一旦表单被提交,浏览器会自动跳转到`action`所指向的页面,这可能...
当你遇到"CSRF token missing or incorrect"的错误时,这通常意味着在处理表单提交时,Django无法找到或验证有效的CSRF令牌。 首先,我们来理解Django中的CSRF机制。Django会在用户首次访问网站时生成一个唯一的...
### 使用Django Form解决表单数据无法动态刷新的两种方法 在Django Web开发中,表单是非常重要的组成部分,它们负责收集用户输入的数据,并确保这些数据的有效性。然而,在某些情况下,开发人员可能会遇到表单数据...
django-bootstrap-form, Django 格式的Twitter Bootstrap Django Bootstrap 表单 用于 Django 表单的Twitter Bootstrap 。一个简单的Django 模板标签,用于处理 Bootstrap 。安装用pip安装 django-bootstr
首先,ModelForm是Django模型和表单的桥梁,它能够通过指定的模型自动生成表单字段,可以大大减少编写重复代码的工作量。在ModelForm中,可以通过Meta内部类定义额外的属性。例如: 1. model:指定ModelForm绑定的...