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':'用户邮箱', }
- 将Models 和 Forms 结合到一起使用,通过Models自动生成表单
- 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(), }
- ① 什么是小部件