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>
...