本章通过实现一个用户提交任务请求的页面,讲述表单、视图、模型、模板间的交互。

首先,我们需要定义一个表单(forms.py)

class CreatetaskForm(forms.Form):
creater = forms.CharField(
label=u"创建者",
widget=BootstrapUneditableInput()
)
manager = forms.ModelChoiceField(
queryset=Manager.objects.all(),
required=True,
label=u"项目负责人",
error_messages={'required': u'必选项'},
)
databases = forms.ModelMultipleChoiceField(
queryset=Database.objects.order_by('id'),
required=True,
label=u"数据库",
error_messages={'required': u'至少选择一个'},
widget=forms.CheckboxSelectMultiple,
)
sql = forms.CharField(
required=False,
label=u"执行SQL",
widget=forms.Textarea(
attrs={
'placeholder':"请在表名前加上schema,如hospital要写成p95169.hospital",
'rows':5,
'style':"width:100%",
}
),
)
desc = forms.CharField(
required=False,
label=u"描述",
widget=forms.Textarea(
attrs={
'placeholder':"如果不是执行SQL(如数据的导入导出等),一定要在描述里说清楚",
'rows':5,
'style':"width:100%",
}
),
)
attachment = forms.FileField(
required=False,
label=u"附件",
help_text=u"如果SQL文本过长,超过2000个字符,请上传附件"
)
def clean(self):
if not self.is_valid():
raise forms.ValidationError(u"以下红色标记部分为必选项")
elif self.cleaned_data['sql'] == u'' and self.cleaned_data['desc'] == u'' :
raise forms.ValidationError(u"如果执行SQL为空,描述为必填项")
else:
cleaned_data = super(CreatetaskForm, self).clean()
return cleaned_data

该表单包含一个多选框和附件上传,然后我们创建一个视图来实例化该表单:

import datetime
@login_required
def createtask(request):
if request.method == 'GET':
form = CreatetaskForm(initial={
'creater':request.user.last_name + request.user.first_name,
})
return render_to_response('createtask.html', RequestContext(request, {'form': form,}))
else:
form = CreatetaskForm(request.POST,request.FILES)
if form.is_valid():
username = request.user.username
t = Task.objects.create(
creater = User.objects.get(username=username),
manager = form.cleaned_data['manager'],
dba = Dba.objects.get(id=1),
state = State.objects.get(statename='Open'),
sql = form.cleaned_data['sql'],
desc = form.cleaned_data['desc'],
createdtime = datetime.datetime.now(),
lastupdatedtime = datetime.datetime.now(),
attachment = form.cleaned_data['attachment'],
)
databaselist = form.cleaned_data['databases']
for db in databaselist:
t.databases.add(db)
t.save()
return render_to_response('base.html', RequestContext(request,{'createtask_success':True,}))
else:
return render_to_response('createtask.html', RequestContext(request, {'form': form,}))

该视图的业务逻辑是:

1)当用户提交表单后,验证表单的正确性

2)如果表单填写不正确,显示错误提示信息

3)如果表单填写正确,在数据库表Task里插入一条信息

其中,模型createtask.html的定义如下:

{% extends "base.html" %}

{% load bootstrap_toolkit %}

{% block extra_head %}
{{ form.media }}
{% endblock %} {% block content %} <h1>创建任务</h1> <div class="well">
<form enctype="multipart/form-data" class="form-horizontal" action="" method="post">
{% csrf_token %}
{{ form|as_bootstrap:"horizontal" }}
<p class="form-actions">
<input type="submit" value="提交" class="btn btn-primary">
<a href="/tasklist/"><input type="button" value="返回" class="btn"></a>
</p>
</form>
</div>
{% endblock %}

最终的效果如下所示:


如果用户没有输入足够的信息,将提示错误信息如下:

如果用户所有的信息都填正确,则提交成功,提示成功信息:

点击OK,返回任务列表,排在第1的就是刚刚创建的任务:

[Django实战] 第9篇 - 表单、视图、模型、模板的交互的更多相关文章

  1. 玩转Django2.0---Django笔记建站基础七(表单与模型)

    第七章 表单与模型 表单是搜集用户数据信息的各种表单元素的集合,作用是实现网页上的数据交互,用户在网站输入信息,然后提交到网站服务器端进行处理(如数据录入和用户登录.注册等). 用户表单是web开发的 ...

  2. Django报错:提交表单报错---RuntimeError: You called this URL via POST, but the URL doesn’t end in a slash and you have APPEND_SLASH set.

    Django报错:提交表单报错---RuntimeError: You called this URL via POST, but the URL doesn’t end in a slash and ...

  3. VS2010 MFC中制作Visual Studio风格的停靠侧栏窗口(CDockablePane里嵌套FormView表单视图)

    VS2010 MFC中制作Visual Studio风格的停靠侧栏窗口(CDockablePane里嵌套FormView表单视图) 1. 在资源窗口里新建一个FormView的Dialog,修改ID为 ...

  4. [MVC]自定义模型绑定器,从表单对模型进行赋值

    一.奇葩的问题 之前自己造轮子的时候,遇到一个很奇怪的问题,虽然需求很奇葩,但是还是尝试解决了一下 当提交的表单里包含多个重复名称的字段的时候,例如 <form action="/Te ...

  5. JavaScript:表单验证模型

    之前做的验证提示以弹框的形式出现太丑陋了,不符合标准的验证提示.如果要想进行更好的数据验证操作,那么必须进行一些模块化设计,通过表单样式的改变来提示.其实,一般的数据验证无非就是那么几种,例如: 大多 ...

  6. 5 第一个Django第4部分(表单和通用视图)

    上一节完成了视图编写,这一节为应用添加投票功能,也就是表单提交. 5.1编写一个简单的表单 5.2使用通用视图 5.3改良视图 5.1编写一个简单的表单 在网页设计中添加Form元素 polls/te ...

  7. Django学习(4)表单,让数据库更美好

    表单,在HTML中的标签为<form></form>,在网页中主要负责数据采集功能.我们在浏览网站时,常常会碰到注册账号.账号登录等,这就是表单的典型应用. 在Django学习 ...

  8. Django - 请求与响应、表单、中间件、上下文处理器

    请求与响应篇 一.HttpRequest对象 服务器接收到http协议的请求后,会根据报文创建HttpRequest对象.视图函数的第一个参数(request)是HttpRequest对象在djang ...

  9. [Django]下拉表单与模型查询

    前言:本文主要针对自定义下拉表单制作,下拉表单的内容是取至于数据库,即动态实现下拉表单 正文: 动态实现下拉表单有两种方法: 一.自己手动写 html 模板中的 <form ...> &l ...

随机推荐

  1. (译)Node.js的 EventEmitter 教程

    原文标题:Node.js EventEmitter Tutorial 原文链接:http://www.hacksparrow.com/node-js-eventemitter-tutorial.htm ...

  2. CodeForces 577A Multiplication Table 质因子数

    题目:click here 题意:看hint就懂了 分析:数论小题,在n0.5时间里求n的质因子数 #include <bits/stdc++.h> using namespace std ...

  3. WTL error C3861: 'DDX_Control': identifier not found

    error C3861: 'DDX_Control': identifier not found 继承类加上     public CWinDataExchange<CMainDlg>, ...

  4. QT中QWidget、QDialog及QMainWindow的区别

    本文转自http://www.cnblogs.com/aqxin/archive/2011/05/23/2054156.html QWidget类是所有用户界面对象的基类. 窗口部件是用户界面的一个基 ...

  5. IM与工作信息流整合

    IM与工作信息流整合,希望减轻用户“信息”负担   从36氪此前的<“明道”现在推出个人免费版本,是怎样的逻辑?>一 文中,我们可以了解到,国内现在的协作产品设计思路主要有两种:一种是像t ...

  6. 电脑cmos是什么?和bois的区别?

    很多人都分不清电脑cmos和bois区别,有人一会儿说什么bois设置,有人一会儿说cmos设置.而看起来这两个又似乎差不多,本文将用最简单的白话文告诉各位,什么是cmos,以及cmos和bois的的 ...

  7. 转: Nodejs概述

    目录 简介 安装与更新 版本管理工具nvm 基本用法 REPL环境 异步操作 全局对象和全局变量 模块化结构 概述 核心模块 自定义模块 fs模块 Stream模式 http模块 实例:搭建一个HTT ...

  8. Maven 版 JPA 最佳实践(转)

    项目结构图 数据库环境 数据库:MySQL 版本:5.x 数据库名:jpa-demo 用户名密码:root/1234 代码清单 1:数据库脚本: ? 1 2 3 4 5 6 7 8 9 10 11 1 ...

  9. Spring Boot Memory Performance

    The Performance Zone is brought to you in partnership with New Relic. Quickly learn how to use Docke ...

  10. python数值计算模块NumPy scipy安装

    NumPy为Python提供了快速的多维数组处理的能力,而SciPy则在NumPy基础上添加了众多的科学计算所需的各种工具包,有了这两个库,Python就有几乎和Matlab一样的处理数据和计算的能力 ...