1、Django中的 forms 模块
- 1、forms 模块的作用
- 通过 forms 模块,允许将表单控件与python文件相结合
- 2、使用 forms 模块
- ①创建 forms.py 文件
- ②导入 forms 模块
- ③创建class,一个class对应一个表单,所有class需要继承自forms.Form
- ④在class中创建属性,一个属性对应一个表单控件
- 参考文档(Forms)
- 在Django中,HttpRequest被演变成了request封装到视图(views)处理函数中的作为参数,该参数,在调用视图处理函数时自动传参
# forms.py
from django import forms
TOPIC_CHOICES = (
# <option value='level1' >1星</option>
('level1', "1星"),
('level2', "2星"),
('level3', "3星"),
('level4', "4星"),
('level5', "5星"),
)
class RemarkForm(forms.Form):
# 创建subject 属性,对应生产一个文本框
# label:控件提示的文本
# initial: 控件的初始值
subject = forms.CharField(label='标题', initial='初始数据')
# 创建email属性,对应生产一个邮件框
email = forms.EmailField(label='邮件')
# 创建一个多行文本域
# widget 取值为 forms.Textarea 则变成多行文本域
message = forms.CharField(label='内容', widget=forms.Textarea)
# 创建一个下拉列表
# choices:指定下拉列表的选项,取值为一个元组
topic = forms.ChoiceField(label='评价', choices=TOPIC_CHOICES)
# 创建复选框
save = forms.BooleanField(label='是否保存')
# views.py
from django.shortcuts import render
from django.http import HttpResponse
from .forms import *
def remark_views(request):
form = RemarkForm()
return render(request, 'remark.html', locals())
# urls.py
from django.conf.urls import url
from django.contrib import admin
from .views import *
urlpatterns = [
url(r'^remark/$', remark_views, name='remark'),
]
- 3、在模板中解析form表单
- ①需要手动添加<form> </form>
- ②需要手动自定义提交按钮<p><input type=“submit” value=“提交”></p>
- ③处理方法可选手动解析和自动解析
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="{% url 'remark' %}" method="post">
{% csrf_token %}
<!--手动解析生成表单控件-->
{% for field in form %}
<p>{{ field.label }}:{{ field }}</p>
{% endfor %}
<p><input type="submit" value="提交"></p>
</form>
<form action="{% url 'remark' %}" method="post">
{% csrf_token %}
<!--自动解析生成表单控件-->
{{ form.as_p }}
</form>
<!--{{ form.as_p }}中p表示p标签-->
<!--{{ form.as_ul }}中ul表示ul标签,需要自定义ul-->
<!--{{ form.as_table }}中table表示table标签,需要自定义table-->
</body>
</html>
- 4、在html中提交的扁担内容也可以传递给forms.Form
- ① 将post中的数据放在EntryForm中
- ② 判断当前数据是否通过验证,此步骤必须验证
- ③ 获取到提交的数据,并封装到一个字典中
- ④ 获取到提交的表单控件数据
# views.py
from django.shortcuts import render
from django.http import HttpResponse
from .forms import *
from .modles import *
def remark_views(request):
if request.method == 'GET':
form = RemarkForm()
return render(request, 'remark.html', locals())
else:
# 接收提交的数据
form = RemarkForm(request.POST) # 将post中的数据放在RemarkForm中
if form.is_valid(): # 判断当前数据是否通过验证
data = form.cleaned_data # 获取到提交的数据,并封装到data中
# 获取到提交的表单控件数据。subject、email等是RemarkForm中的属性名
subject = data['subject']
email = data['email']
message = data['message']
topic = data['topic']
Entry(**data).save() # 保存到数据库
return HttpResponse(subject + email + message + topic)
- 5、forms 模块的高级处理
- 将Models 和 Forms 结合到一起使用,通过Models自动生成表单
- ① 创建 class EntryForm,并继承自forms.ModelForm
- ② 创建内部类 Meta ,并定义相关信息
- model:指定相关联的models
- fields :
- 指定一个列表, 声明允许生成表单控件的属性
- ‘_ all _’,表示全部属性允许被生成表单控件
- labels:取值为字典,{‘属性名’:‘显示文本’}
# models.py
from django.db import models
class User(models.Model):
uname = models.CharField(max_length=30, verbose_name='用户名')
upwd = models.CharField(max_length=50, verbose_name='用户密码')
uage = models.IntegerField(verbose_name='用户年龄')
uemail = models.EmailField(verbose_name='用户邮箱')
# forms.py
from django import forms
from .models import *
class UserForm(forms.ModelForm):
class Meta:
model = User # 表单控件关联到 User 的 Models类上
fields = '__all__' # User 中的所有字段均生成表单控件
# fields = ['uname', 'uage'] 部分字段生成表单控件
labels = {
'uname':'用户名', # uname= forms.CharField(label='用户名')
'upwd':'用户密码',
'uage':'用户年龄',
'uemail':'用户邮箱',
}
- 6、forms 模块的小部件
- ① 什么是小部件
- 生成到网页上的控件类型
- ② 常用的小部件
- TextInput:<input type=“text” >
- NumberInput:<input type=“number” >
- EmailInput:<input type=“email” >
- URLInput:<input type=“url” >
- PasswordInput:<input type=“password” >
- HiddenInput:<input type=“hidden” >
- CheckboxInput:<input type=“checkbox” >
- Textarea:<textarea></textarea>
- Select:<select></select>
- ③ 小部件的使用:
- 继承自forms.Form
- 继承自forms.ModelForm
# forms.py
from django import forms
from .models import *
# 继承自forms.Form 使用小部件方式
class RemarkForm(forms.Form):
# 创建一个多行文本域
# widget 取值为 forms.Textarea 则变成多行文本域
message = forms.CharField(
label='内容',
widget=forms.Textarea(
attrs={
'class':'form-control', # 在此控件中增加 class 等属性
'placeholder': '请输入内容'
}
)
)
# 继承自forms.ModelForm 使用小部件方式
class UserForm(forms.ModelForm):
class Meta:
model = User # 表单控件关联到 User 的 Models类上
fields = '__all__' # User 中的所有字段均生成表单控件
labels = {
'uname':'用户名', # uname= forms.CharField(label='用户名')
'upwd':'用户密码',
'uage':'用户年龄',
'uemail':'用户邮箱',
}
widgets = {
'uname': forms.TextInput(attrs={
'class': 'form-control', # 在此控件中增加 class 等属性
'palceholder': '请输入用户名'
}),
'upwd': forms.PasswordInput(),
'uage': forms.NumberInput(),
'uemail': forms.EmailInput(),
}