Django中的Form表单

时间:2021-04-10 07:42:57

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生成了一个简单表单,效果如下图:

Django中的Form表单

二、填充数据

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>

...