[Django实战] 第9篇 - 表单、视图、模型、模板的交互

时间:2023-02-14 10:33:11

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

首先,我们需要定义一个表单(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 %}

最终的效果如下所示:

[Django实战] 第9篇 - 表单、视图、模型、模板的交互
如果用户没有输入足够的信息,将提示错误信息如下:

[Django实战] 第9篇 - 表单、视图、模型、模板的交互

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

[Django实战] 第9篇 - 表单、视图、模型、模板的交互

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

[Django实战] 第9篇 - 表单、视图、模型、模板的交互

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

  1. 玩转Django2&period;0---Django笔记建站基础七&lpar;表单与模型&rpar;

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

  2. Django报错:提交表单报错---RuntimeError&colon; You called this URL via POST&comma; but the URL doesn’t end in a slash and you have APPEND&lowbar;SLASH set&period;

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

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

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

  4. &lbrack;MVC&rsqb;自定义模型绑定器,从表单对模型进行赋值

    一.奇葩的问题 之前自己造*的时候,遇到一个很奇怪的问题,虽然需求很奇葩,但是还是尝试解决了一下 当提交的表单里包含多个重复名称的字段的时候,例如 <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. &lbrack;Django&rsqb;下拉表单与模型查询

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

随机推荐

  1. MYSQL 数据库导入导出命令

    MySQL命令行导出数据库 1,进入MySQL目录下的bin文件夹:cd MySQL中到bin文件夹的目录 如我输入的命令行:cd C:\Program Files\MySQL\MySQL Serve ...

  2. osgconv 批量转换

    @echo offfor /f "delims=" %%i in ('dir/b *.osg') do ( "osgconv.exe" "%%~ni. ...

  3. 在没装VS2010的机器上运行VS2010开发的C&plus;&plus;程序

    在VS2010下写了一个win32控制台应用程序,编译ok.exe,需要依赖osg相关动态库 第一次编译的是Debug版本的,直接将ok.exe和osg相关dll文件拷贝到没有安装VS2010机器上运 ...

  4. Android导航菜单横向左右滑动并和下方的控件实现联动

    这个是美团网个人订单的效果,找了很多地方都没找到,自己研究了两天终于弄出来了^_^,有什么问题希望大家指出来,谢谢. 实现原理是上方使用HorizontalScrollView这个可以水平横向拖动的控 ...

  5. 电子器件行业ERP实施案例

    XX有限公司是一家致力于能源需求侧管理,为工业,建筑,交通等终端能耗领域提供系统高效的能源管理解决方案的中港合资企业,作为最早从事电力计量与采集的省级高新技术企业,自2001年成立以来,专注于用户侧智 ...

  6. CJOJ 血帆海盗

    Description 随着资本的扩大,藏宝海湾贸易亲王在卡利姆多和东部王 国大陆各建立了N/2 个港口.大灾变发生以后,这些港口之间失去了联系,相继脱离了藏宝海湾贸易亲王的管辖,各自为政.利益的驱动 ...

  7. CCF系列之相反数&lpar;201403-1&rpar;

    试题名称: 相反数 试题编号: 201403-1时间限制: 1.0s 内存限制: 256.0MB 问题描述 有 N 个非零且各不相同的整数.请你编一个程序求出它们中有多少对相反数(a 和 -a 为一对 ...

  8. ●POJ 2983 Is the Information Reliable&quest;

    题链: http://poj.org/problem?id=2983 题解: 差分约束. 1).对于条件(P u v w),不难发现反映到图上就是: $dis[u]-dis[v]=w$,所以添加两条边 ...

  9. html5 标签在 IE 下使用

    (function(){if(!/*@cc_on!@*/0)return;var e = "abbr,article,aside,audio,bb,canvas,datagrid,datal ...

  10. &period;NET平台下使用Redis

    using DBI.SaaS.Web.Models.Args; using Rafy; using StackExchange.Redis; using System; using System.Co ...