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>

...

原文地址:https://www.cnblogs.com/ahaii/p/5725662.html