[Django实战] 第9篇 - 表单、视图、模型、模板的交互
本章通过实现一个用户提交任务请求的页面,讲述表单、视图、模型、模板间的交互。
首先,我们需要定义一个表单(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篇 - 表单、视图、模型、模板的交互的更多相关文章
- 玩转Django2.0---Django笔记建站基础七(表单与模型)
第七章 表单与模型 表单是搜集用户数据信息的各种表单元素的集合,作用是实现网页上的数据交互,用户在网站输入信息,然后提交到网站服务器端进行处理(如数据录入和用户登录.注册等). 用户表单是web开发的 ...
- 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 ...
- VS2010 MFC中制作Visual Studio风格的停靠侧栏窗口(CDockablePane里嵌套FormView表单视图)
VS2010 MFC中制作Visual Studio风格的停靠侧栏窗口(CDockablePane里嵌套FormView表单视图) 1. 在资源窗口里新建一个FormView的Dialog,修改ID为 ...
- [MVC]自定义模型绑定器,从表单对模型进行赋值
一.奇葩的问题 之前自己造轮子的时候,遇到一个很奇怪的问题,虽然需求很奇葩,但是还是尝试解决了一下 当提交的表单里包含多个重复名称的字段的时候,例如 <form action="/Te ...
- JavaScript:表单验证模型
之前做的验证提示以弹框的形式出现太丑陋了,不符合标准的验证提示.如果要想进行更好的数据验证操作,那么必须进行一些模块化设计,通过表单样式的改变来提示.其实,一般的数据验证无非就是那么几种,例如: 大多 ...
- 5 第一个Django第4部分(表单和通用视图)
上一节完成了视图编写,这一节为应用添加投票功能,也就是表单提交. 5.1编写一个简单的表单 5.2使用通用视图 5.3改良视图 5.1编写一个简单的表单 在网页设计中添加Form元素 polls/te ...
- Django学习(4)表单,让数据库更美好
表单,在HTML中的标签为<form></form>,在网页中主要负责数据采集功能.我们在浏览网站时,常常会碰到注册账号.账号登录等,这就是表单的典型应用. 在Django学习 ...
- Django - 请求与响应、表单、中间件、上下文处理器
请求与响应篇 一.HttpRequest对象 服务器接收到http协议的请求后,会根据报文创建HttpRequest对象.视图函数的第一个参数(request)是HttpRequest对象在djang ...
- [Django]下拉表单与模型查询
前言:本文主要针对自定义下拉表单制作,下拉表单的内容是取至于数据库,即动态实现下拉表单 正文: 动态实现下拉表单有两种方法: 一.自己手动写 html 模板中的 <form ...> &l ...
随机推荐
- MOSS程序中如何发Mail?
我们使用.NET类库中的API发Mail的时候,我们要配置他的SMTP Server等,但是在Sharepoint里,已经提供了相关的封装的方法: SPUtility.SendEmail(SPWeb, ...
- MVC过滤器进行统一登录验证
统一登录验证: 1.定义实体类Person:利用特性标签验证输入合法性设计登录页面 1 2 3 4 5 6 7 8 9 public class Person { [DisplayName(& ...
- SQL Server 2012学习笔记 1 命令行安装
setup.exe /Q /IACCEPTSQLSERVERLICENSETERMS /ACTION=install /PID=748RB-X4T6B-MRM7V-RTVFF-CHC8H /FEATU ...
- C#连接Oracle数据库基本类
C#用来连接oracle数据库的基本类: using System; using System.Collections.Generic; using System.Linq; using System ...
- 【MFC相关】MFC入门相关
1.MFC的“匈牙利标识符命名法”,这是一个约定,可以增加代码的可读性: 声明或定义了一个类,那么这个类可以以“C”(class)为前缀,如CHelloWorldDlg类: 定义一个无符号型的局部变量 ...
- [Swust OJ 360]--加分二叉树(区间dp)
题目链接:http://acm.swust.edu.cn/problem/360/ Time limit(ms): 1000 Memory limit(kb): 65535 Description ...
- css伪类伪元素
在CSS中,模式(pattern)匹配规则决定哪种样式规则应用于文档树(document tree)的哪个元素.这些模式叫着选择符(selector). 一条CSS规则(rule)是选择符{属性:值; ...
- html 浮动元素
在CSS布局中分为内联元素(display:inline)和块状元素(display:block),块状元素默认会占据一行,可设置高度宽度以及边距,而内联元素不会也不能设置.常见的内联元素有:a.sp ...
- .net 基础错误-string.replace 方法
1.string string.Replace(string oldValue,string newValue) 返回一个新的字符串,其中当前示例中出现的所有指定字符串都替换另一个指定字符串 错误:总 ...
- codeforces 522D. Closest Equals 线段树+离线
题目链接 n个数m个询问, 每次询问输出给定区间中任意两个相同的数的最近距离. 先将询问读进来, 然后按r从小到大排序, 将n个数按顺序插入, 并用map统计之前是否出现过, 如果出现过, 就更新线段 ...