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

首先,我们需要定义一个表单(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. zoj 2256 Mincost

    #include<stdio.h> int main(void) { int kil; ; double sum; ) { sum=; flag=; while(kil) { ) { su ...

  2. Android应用开发基础篇(11)-----ViewFlipper

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/01/2376067.html 一.概述 ViewFlipper这个部件是用来实现多页显示的,多页 ...

  3. 建造者模式->代码示例

    <?php interface Builder{ public function head(); public function body(); public function foot(); ...

  4. Githut Token (hidden): Githut 安装验证

    登录https://github.com 进入https://github.com/settings/profile 参考 http://jingyan.baidu.com/article/22fe7 ...

  5. python --appium搭建环境过程 ---新手总结(大牛勿喷,新手互相交流)

    首先安装python 安装包:https://yunpan.cn/cSdYZqjJ4xDZ3  访问密码 4bf9 1.安装pip   cd 到pip安装包  python setup.py inst ...

  6. ios如何实现推送通知

    推送通知的步骤:1.询问是否允许推送通知.2.如果用户允许在APPDELEGATE 中实现 - (void)application:(UIApplication *)application didRe ...

  7. Aptana jQuery自动提示

    参考 http://www.ghugo.com/aptana-studio-3-jquery-autocomplete/ 对于第一种方案 是每个项目都能生效的  不过有时候网络不好时就无法顺利获取提示 ...

  8. DB2 权限控制

    http://blog.csdn.net/liujinwei2005/article/details/8606983 http://www.ibm.com/developerworks/cn/data ...

  9. Qt多线程编程总结(一)(所有GUI对象都是线程不安全的)

    Qt对线程提供了支持,基本形式有独立于平台的线程类.线程安全方式的事件传递和一个全局Qt库互斥量允许你可以从不同的线程调用Qt方法. 这个文档是提供给那些对多线程编程有丰富的知识和经验的听众的.推荐阅 ...

  10. 关于Unix时间戳

    如何在不同编程语言中获取现在的Unix时间戳(Unix timestamp)? Java time JavaScript Math.round(new Date().getTime()/1000)ge ...