form表单的理解

来源:互联网 发布:四川广电网络广元 编辑:程序博客网 时间:2024/06/01 08:11

1、首先项目中 的目录结构为:


2、其中项目的urls.py内容为:

from django.conf.urls import  include, urlfrom tools import viewsfrom django.contrib import adminadmin.autodiscover()urlpatterns = [    # Examples:    url(r'^$', views.index, name='home'),    # url(r'^blog/', include('blog.urls')),    url(r'^admin/', include(admin.site.urls)),]

3、APP tools中的view.py为:(测试用的

# coding:utf-8from django.shortcuts import renderfrom django.http import HttpResponse# 引入我们创建的表单类from .forms import AddFormdef index(request):    # 当提交表单时    if request.method == 'POST':        # form 包含提交的数据        form = AddForm(request.POST)        return HttpResponse(form)#自己添加的用于测试上一句form中的内容是什么?#所以把下面几句用三个'''给屏蔽了。        '''# 如果提交的数据合法        if form.is_valid():            a = form.cleaned_data['a']            b = form.cleaned_data['b']            return HttpResponse(str(int(a) + int(b)))'''    else:        form = AddForm()        return HttpResponse(form)#用于测试form内容,所以把下面一句给屏蔽了。#当路由的时候,第一次form中没有参数,只是自己Field表现的空文本框,比如(IntegerField)    #return render(request, 'index.html', {'form': form})

完整版为:

# coding:utf-8from django.shortcuts import renderfrom django.http import HttpResponse# 引入我们创建的表单类from .forms import AddFormdef index(request):    # 当提交表单时    if request.method == 'POST':        # form 包含提交的数据        form = AddForm(request.POST)        #如果提交的数据合法        if form.is_valid():            a = form.cleaned_data['a']            b = form.cleaned_data['b']            return HttpResponse(str(int(a) + int(b)))    else:#当正常访问时        form = AddForm()    return render(request, 'index.html', {'form': form})


4、其中tools中的forms.py文件为:

from django import forms#自己就有文本框了。class AddForm(forms.Form):    a = forms.IntegerField()    b = forms.IntegerField()
5、tools中的templates中的index.html的内容为:

<form method='post'>{% csrf_token %}{{ form }}<input type="submit" value="提交"></form>

6、项目中的setting文件内容为;

"""Django settings for zqxt_forms2 project.For more information on this file, seehttps://docs.djangoproject.com/en/1.6/topics/settings/For the full list of settings and their values, seehttps://docs.djangoproject.com/en/1.6/ref/settings/"""# Build paths inside the project like this: os.path.join(BASE_DIR, ...)import osBASE_DIR = os.path.dirname(os.path.dirname(__file__))# Quick-start development settings - unsuitable for production# See https://docs.djangoproject.com/en/1.6/howto/deployment/checklist/# SECURITY WARNING: keep the secret key used in production secret!SECRET_KEY = 's8_)6s1vp2lcf)iu7qq0fu138c!-$iy&0)td0faol@b1fl2&-g'# SECURITY WARNING: don't run with debug turned on in production!DEBUG = TrueTEMPLATE_DEBUG = TrueALLOWED_HOSTS = []# Application definitionINSTALLED_APPS = (    'django.contrib.admin',    'django.contrib.auth',    'django.contrib.contenttypes',    'django.contrib.sessions',    'django.contrib.messages',    'django.contrib.staticfiles',    'tools',)MIDDLEWARE_CLASSES = (    'django.contrib.sessions.middleware.SessionMiddleware',    'django.middleware.common.CommonMiddleware',    'django.middleware.csrf.CsrfViewMiddleware',    'django.contrib.auth.middleware.AuthenticationMiddleware',    'django.contrib.messages.middleware.MessageMiddleware',    'django.middleware.clickjacking.XFrameOptionsMiddleware',)ROOT_URLCONF = 'zqxt_forms2.urls'TEMPLATES = [    {        'BACKEND': 'django.template.backends.django.DjangoTemplates',        'DIRS': [BASE_DIR+'/tools/templates',],        'APP_DIRS': True,        'OPTIONS': {            'context_processors': [                'django.template.context_processors.debug',                'django.template.context_processors.request',                'django.contrib.auth.context_processors.auth',                'django.contrib.messages.context_processors.messages',            ],        },    },]WSGI_APPLICATION = 'zqxt_forms2.wsgi.application'# Database# https://docs.djangoproject.com/en/1.6/ref/settings/#databasesDATABASES = {    'default': {        'ENGINE': 'django.db.backends.sqlite3',        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),    }}# Internationalization# https://docs.djangoproject.com/en/1.6/topics/i18n/LANGUAGE_CODE = 'en-us'TIME_ZONE = 'UTC'USE_I18N = TrueUSE_L10N = TrueUSE_TZ = True# Static files (CSS, JavaScript, Images)# https://docs.djangoproject.com/en/1.6/howto/static-files/STATIC_URL = '/static/'

测试结果为:

首先,第一次加载URL时,调用views.index方法,因为没有参数的输入,所以,先走的else分支。即form其实就是两个IntegerField框


放开views.index中的else部分的return,进一步测试得:

输入参数后,



点击提交后,

if request.method == 'POST':
        # form 包含提交的数据
        form = AddForm(request.POST)
        return HttpResponse(form)#自己添加的用于测试上一句form中的内容是什么?



代码全部放开,完整版的view:

测试结果为:



新手可能觉得这样变得更麻烦了,有些情况是这样的,但是 Django 的 forms 提供了:

  1. 模板中表单的渲染

  2. 数据的验证工作,某一些输入不合法也不会丢失已经输入的数据。

  3. 还可以定制更复杂的验证工作,如果提供了10个输入框,必须必须要输入其中两个以上,在 forms.py 中都很容易实现


也有一些将 Django forms 渲染成 Bootstrap 的插件,也很好用,很方便。

扩展:如果提交后在同一个页面显示结果呢?请看 Django Ajax

学习链接:http://code.ziqiangxuetang.com/django/django-forms.html
原创粉丝点击