Django中的Form表单
Django中已经定义好了form类,可以很容易的使用Django生成一个表单。
一、利用Django生成一个表单:
1、在应用下创建一个forms文件,用于存放form表单。然后在forms中实例华一个表单。
forms.py
from django import forms class BookForm(forms.Form): name=forms.CharField(max_length=10) publisher_id=forms.IntegerField(widget=forms.Select) #选择 publish_date=forms.DateField()
2、定义视图函数,将该表单传递给前端页面
views.py
from test1 import forms def index(request): form=forms.BookForm() return render(request,'index.html',{'book_form':form})
3、定义前端生成表单的页面
index.html
<html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {{ book_form }} </body> </html>
4、url的配置
urls.py
urlpatterns = [ url(r'^$',views.index) ]
经过以上几步的配置,就由Django生成了一个简单表单,效果如下图:
二、填充数据
1、定义视图处理函数
views.py
def index(request): form=forms.BookForm() if request.method=='POST': form=forms.BookForm(request.POST) #表单提交的数据 if form.is_valid(): #验证提交的数据是否合法 form_data=form.cleaned_data #form.cleaned_data 为验证通过的数据 form_data['publisher_id']=request.POST.get('publisher_id') #从数据去里取publisher_id book_obj=models.Book(**form_data) #将整个表单获取的数据传递给models.Book对象, book_obj.save() #将获取的数据插入数据库 else: print form.errors #如果验证不通过,输出错误 publisher_list=models.Publisher.objects.all() #生成出版社列表 return render(request,'index.html',{'book_form':form,'publishers':publisher_list}) #将表单提交的数据和出版社列表返回前端
2、定义前端html页面
index.html
<html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="" method="post"> #Django中的Form不带form标签,自定义一个form标签 {{ book_form }} {{ book_form.publisher_id}} <select name="publisher_id"> {% for publisher in publishers %} <option value={{ publisher.id }}>{{ publisher.name }}</option> {% endfor %} </select> <input type="submit" value="创建图书"> </form> </body> </html>
三、ModelForm的使用
我们知道,在创建数据库的时候,在models.py文件中就定义了各个字段的类型已经限制条件。而此处的forms.py文件中又定义了一遍,这样使用起来很不方便。为了不重复定义,直接引用models.py中各个字段的定义,需要使用ModelForm类。
forms.py可以这样定义
from test1 import models class BookModelForm(forms.ModelForm): class Meta: model=models.Book exclude=() #关联表中所有的字段 widgets={ 'name':forms.TextInput(attrs={'class':'form-control'}), #定义样式 }
views.py
def book_modelform(request): form=forms.BookModelForm if request.method=='POST': form=forms.BookModelForm(request.POST) if form.is_valid(): form.save() else: print form.errors return render(request,'index1.html',{'book_modelform':form})
index1.html
<html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="" method="post"> {% csrf_token %} {{ book_modelform }} <input type="submit" value="创建图书"> </form> </body> </html>
...