Django进阶Form篇

一、django表单系统中,所有的表单类都作为django.forms.Form的之类创建,包括ModelForm

关于django的表单系统,主要分两种:

1.基于django.forms.Form:所有表单类的父类

2.基于django.forms.ModelForm:可以和模型类绑定的Form

 

案例:实现添加出版社信息的功能

二、不使用Django.Form的情况

add_publisher.html

<form action="" method="post">
    {% csrf_token %}
    名称:<input type="text" name="name"><br>
    地址:<input type="text" name="address"><br>
    城市:<input type="text" name="city"><br>
    省份:<input type="text" name="state_province"><br>
    国家:<input type="text" name="country"><br>
    网址:<input type="text" name="website"><br>
    名称:<input type="submit" value="提交"><br>
</form>

views.py

from django.http import HttpResponse
from django.shortcuts import render
from hello.models import Publisher


def add_publisher(request):
    if request.method == 'POST':
        name = request.POST.get("name")
        address = request.POST.get("address")
        city = request.POST.get("city")
        state_province = request.POST.get("state_province")
        country = request.POST.get("country")
        website = request.POST.get("website")
        Publisher.objects.create(
            name=name,
            address=address,
            city=city,
            state_province=state_province,
            country=country,
            website=website,
        )
        return HttpResponse("Add Publisher Succ!")
    else:
        return render(request, 'add_publisher.html', locals())

三、使用Form的情况

add_publisher.html

<form action="{% url 'add_publisher' %}" method="post">
    {% csrf_token %}
    {{ publisher_form.as_p }}
{#    {{ publisher_form.as_table }}#}
{#    {{ publisher_form.as_ul }}#}
    <input type="submit" value="提交">
</form>

forms.py

from django import forms


class PublisherForm(forms.Form):
    name = forms.CharField(label="名称")
    address = forms.CharField(label="地址")
    city = forms.CharField(label="城市")
    state_province = forms.CharField(label="省份")
    country = forms.CharField(label="国家")
    website = forms.URLField(label="网址")

 

views.py

from django.http import HttpResponse
from django.shortcuts import render
from hello.models import Publisher
from hello.forms import PublisherForm


def add_publisher(request):
    if request.method == 'POST':
        publisher_form = PublisherForm(request.POST)
        if publisher_form.is_valid():
            Publisher.objects.create(
                name=publisher_form.cleaned_data.get("name"),
                address=publisher_form.cleaned_data.get("address"),
                city=publisher_form.cleaned_data.get("city"),
                state_province=publisher_form.cleaned_data.get("state_province"),
                country=publisher_form.cleaned_data.get("country"),
                website=publisher_form.cleaned_data.get("website"),

            )
            return HttpResponse("Add Publisher Succ!")
    else:
        publisher_form = PublisherForm()
    return render(request, 'add_publisher.html', locals())

 

四、使用ModelForm的情况

 add_publisher.html

<form action="{% url 'add_publisher' %}" method="post">
    {% csrf_token %}
    {{ publisher_form.as_p }}
    <input type="submit" value="提交">
</form>

forms.py

from django import forms
from hello.models import Publisher


class PublisherForm(forms.ModelForm):
    class Meta:
        model = Publisher
        exclude = ('id',)

views.py

from django.http import HttpResponse
from django.shortcuts import render
from hello.forms import PublisherForm


def add_publisher(request):
    if request.method == 'POST':
        publisher_form = PublisherForm(request.POST)
        if publisher_form.is_valid():
            publisher_form.save()
            return HttpResponse("Add Publisher Succ!")
    else:
        publisher_form = PublisherForm()
    return render(request, 'add_publisher.html', locals())

 

 总结:

使用Django中的Form可以大大简化代码,常用的表单功能特性都整合到了Form中,而ModelForm可以和Model进行绑定,更进一步简化操作。

 

更多详见:https://docs.djangoproject.com/en/1.10/ref/forms/api/

              https://docs.djangoproject.com/en/1.10/ref/forms/fields/

 


***微信扫一扫,关注“python测试开发圈”,了解更多测试教程!***
posted @ 2017-03-03 16:38  鲨鱼逛大街  阅读(436)  评论(0编辑  收藏  举报