[oldboy-django][2深入django]老师管理 -- form表单如何生成多选框标签,多选框的默认值显示,以及多选框数据插入到数据库,多选框数据更改到数据库
1 form表单如何生成多选框(包含了多选框可选择内容)
- Form设置班级输入框为 select多选
- 多选
class TeacherForm(Form):
name = fields.CharField(max_length=,
widget=widgets.TextInput(attrs={'class': 'form-control'})
)
cls = fields.MultipleChoiceField(
choices=models.Classes.objects.values_list('id', 'title'),
widget=widgets.SelectMultiple(attrs={'class': 'form-control'})
)
2 上面存在bug:刷新页面无法动态刷新数据库数据
# BUG:页面刷新时,无法动态显示数据库内容
分别打开添加老师(或者学生)的页面,和添加班级的页面, 然后再添加班级页面新添加一个班级。
刷选添加老师(或者学生)页面,发现班级下拉框并没有动态增加刚才新增加的班级。 原因分析:出现在class TeacherForm和StudentForm定义上,以TeacherForm为例
class TeacherForm(Form):
name = fields.CharField(max_length=,
widget=widgets.TextInput(attrs={'class': 'form-control'})
)
cls = fields.MultipleChoiceField(
choices=models.Classes.objects.values_list('id', 'title'),
widget=widgets.SelectMultiple(attrs={'class': 'form-control'})
) 在实例化一个TeacherForm对象时,由于name, cls为类变量,所以这两个类变量只要第一次生成后,
后面实例化对象时,这两个变量是不会改变的。
在调用父类init函数时,会将cls, name放到父类的self.fields里面
self.fields = {'name': name, 'cls': cls} 因此解决办法出来了,在每一次实例化对象时,再获取数据库的值给cls,
重新刷新self.fields里面的cls字段内容
class TeacherForm(Form):
name = fields.CharField(max_length=,
widget=widgets.TextInput(attrs={'class': 'form-control'})
)
cls = fields.MultipleChoiceField(
choices=models.Classes.objects.values_list('id', 'title'),
# 多选这个可不能删,因为下面的init修改的不是这里
widget=widgets.SelectMultiple(attrs={'class': 'form-control'})
) def __init__(self, *args, **kwargs):
super(TeacherForm, self).__init__(*args, **kwargs)
self.fields['cls'].widget.choices = models.Classes.objects.values_list('id', 'title')
3 多选框的内容如何插入数据库
obj = TeacherForm(request.POST)
if obj.is_valid():
print(obj.cleaned_data)
# 多对多关系插入数据库,主要是插入teacher表,和第三张表
class_list = obj.cleaned_data.pop('cls')
print(class_list)
teacher = models.Teacher.objects.create(**obj.cleaned_data)
teacher.cls.add(*class_list)
4 多选框的默认显示
initial中的多选框key的value必须是列表
def edit_teacher(request, nid):
if request.method == "GET":
row = models.Teacher.objects.filter(id=nid).first()
class_ids = row.cls.values_list('id')
class_id_list = list(zip(*class_ids))[0] if list(zip(*class_ids)) else []
obj = TeacherForm(initial={'name': row.name, 'cls': class_id_list})
# obj = TeacherForm(initial={'name': row.name, 'cls': [1,2]})
return render(request, 'app01_edit_teacher.html', {'obj': obj, 'nid': nid})
5 多选框数据更改到数据库
obj = TeacherForm(request.POST)
if obj.is_valid():
print(obj.cleaned_data)
models.Teacher.objects.filter(id=nid).update(name=obj.cleaned_data['name'])
teacher = models.Teacher.objects.filter(id=nid).first()
teacher.cls.set(obj.cleaned_data['cls'])
6 老师管理
6.1 查看老师列表
6.1.1 前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7-dist/css/bootstrap.css">
<link rel="stylesheet" href="/static/plugins/font-awesome-4.7.0/css/font-awesome.css">
</head>
<body>
<h4>老师管理</h4>
<p>
<a href="/app01/add_teacher" class="btn btn-primary">添加</a>
</p>
<table class="table table-striped table-bordered table-hover table-condensed">
<thead>
<tr>
<th>ID</th>
<th>姓名</th>
<th>班级</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for item in teacher_list %}
<tr>
<td>{{ item.id }}</td>
<td>{{ item.name }}</td>
<td>
{% for x in item.cls.values_list %}
{{ x.1}}
{% endfor %}
</td>
<td>
<a href="/app01/edit_teacher/nid={{ item.id }}" class="glyphicon glyphicon-pencil">编辑</a>|
<a href="/app01/del_teacher/nid={{ item.id }}" class="glyphicon glyphicon-trash">删除</a>
</td>
{#点击删除是一个get请求,要想告诉服务器id,可以通过url get请求获取,或者url匹配到传递给视图#}
</tr>
{% endfor %} </tbody>
</table>
<nav aria-label="Page navigation">
<ul class="pagination">
{{ page_info.pager|safe }}
</ul>
</nav>
</body>
</html>
6.1.2 视图
def teachers(request):
teacher_list = models.Teacher.objects.all()
return render(request, 'app01_teacher_list.html', {'teacher_list': teacher_list})
6.2 增加老师
6.2.1 前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7-dist/css/bootstrap.css">
<link rel="stylesheet" href="/static/plugins/font-awesome-4.7.0/css/font-awesome.css">
</head>
<body>
<div style="width:500px;margin:0 auto">
<h4 style="margin-left: 25px;">添加老师</h4>
<form class="form-horizontal" action="/app01/add_teacher" method="POST">
{% csrf_token %}
<div class="form-group">
<label class="col-sm-2 control-label">姓名:</label>
<div class="col-sm-10">
{{ obj.name }}{{ obj.errors.name.0 }}
</div>
</div> <div class="form-group">
<label class="col-sm-2 control-label">班级:</label>
<div class="col-sm-10">
{{ obj.cls }} {{ obj.errors.cls.0 }}
</div>
</div> <div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<input type="submit" class="btn btn-default" value="提交"/>
</div>
</div>
</form>
</div> </body>
</html>
6.2.2 视图
def add_teacher(request):
if request.method == "GET":
obj = TeacherForm()
return render(request, 'app01_add_teacher.html', {'obj': obj})
else:
obj = TeacherForm(request.POST)
if obj.is_valid():
print(obj.cleaned_data)
# 多对多关系插入数据库,主要是插入teacher表,和第三张表
class_list = obj.cleaned_data.pop('cls')
print(class_list)
teacher = models.Teacher.objects.create(**obj.cleaned_data)
teacher.cls.add(*class_list)
return redirect('/app01/teachers')
else:
print('POST=', request.POST)
print('errors=', obj.errors)
return render(request, 'app01_teacher_list.html', {'obj': obj})
6.3 编辑老师
6.3.1 前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/app01/edit_teacher/nid={{ nid }}" method="POST">
{% csrf_token %}
{{ obj.name }}
{{ obj.cls }}
<p><input type="submit" value="提交"></p>
</form>
</body>
</html>
6.3.2 视图
def edit_teacher(request, nid):
if request.method == "GET":
row = models.Teacher.objects.filter(id=nid).first()
class_ids = row.cls.values_list('id')
class_id_list = list(zip(*class_ids))[0] if list(zip(*class_ids)) else []
obj = TeacherForm(initial={'name': row.name, 'cls': class_id_list})
# obj = TeacherForm(initial={'name': row.name, 'cls': [1,2]})
return render(request, 'app01_edit_teacher.html', {'obj': obj, 'nid': nid})
else:
print('hello')
obj = TeacherForm(request.POST)
if obj.is_valid():
print(obj.cleaned_data)
models.Teacher.objects.filter(id=nid).update(name=obj.cleaned_data['name'])
teacher = models.Teacher.objects.filter(id=nid).first()
teacher.cls.set(obj.cleaned_data['cls'])
return redirect('/app01/teachers')
else:
return render(request, 'app01_edit_teacher.html', {'obj': obj, 'nid': nid})
[oldboy-django][2深入django]老师管理 -- form表单如何生成多选框标签,多选框的默认值显示,以及多选框数据插入到数据库,多选框数据更改到数据库的更多相关文章
- Django学习笔记(6)——Form表单
知识储备:HTML表单form学习 表单,在前端页面中属于最常见的一个东西了.基本上网站信息的提交都用到了表单,所以下面来学习Django中优雅的表单系统:Form 表单的主要作用是在网页上提供一个图 ...
- django系列9--django中的组件(form表单)
modelform整体 from django import forms from app01 import models import hashlib from django.core.except ...
- Django中三种方式写form表单
除了在html中自己手写form表单外,django还可以通过 继承django.forms.Form 或django.forms.ModelForm两个类来自动生成form表单,下面依次利用三种方式 ...
- 72、django之简单验证码实现与form表单钩子函数补充
本篇主要讲解简单的验证码实现,验证码使用基本都是找现成的组件来实现,用代码实现这个简单功能主要是了解了解验证码内部的实现. 本篇导航: 五位验证码图示 代码实现 登录验证 Form组件钩子函数补充 一 ...
- django之简单验证码实现与form表单钩子函数补充
本篇主要讲解简单的验证码实现,验证码使用基本都是找现成的组件来实现,用代码实现这个简单功能主要是了解了解验证码内部的实现. 本篇导航: 五位验证码图示 代码实现 登录验证 Form组件钩子函数补充 一 ...
- Django 之 form表单
Django中的Form表单 1.背景 平时我们在书写form表单时,经常都是手动的去写一些input标签,让用户输入一些功能,进行一些校验的判断,等等.Django中的form表单就能够帮我们去实现 ...
- Django之form表单操作
小白必会三板斧 from django.shortcuts import render,HttpResponse,redirect HttpRespone:返回字符串 render:返回html页面 ...
- python_Django 实现登入功能form表单的参数接收处理
1.创建Django工程. 参考https://www.cnblogs.com/CK85/p/10159159.html中步骤. 2.在urls.py文件中添加url分发路径 "" ...
- Feign Form表单POST提交
Form表单的POST提交,调用该类接口最长用的方式就是HttpClient,如果使用Feign,如何实现呢? 首先,看下Http中已Form的形式做Post提交的定义: -------------- ...
随机推荐
- hihoCoder #1044 : 状态压缩·一 (清垃圾)
题意: 某车厢有一列座位,共有n个位置,清洁工要在这n个位置上清垃圾,但是不能全部位置都清理,只能选择部分.选择的规则是,连续的m个位置内,不能够清理超过q个,也就是说从第1~m个位置最多可以清q个, ...
- iOS解析新浪微博的@##以及URL链接并展示
最近在做一个跟微博相关的应用.其中涉及到了对微博中@.##以及URL链接的解析与展示.分享一下个人处理的方式,希望对需要的人有所帮助. 最终的展现效果: 首先,第一步是你得从纯文本中找到它们.毫无疑问 ...
- 【BZOJ1857】传送带(分治经典:三分套三分)
点此看题面 大致题意: 一个二维平面上有两条传送带\(AB\)和\(CD\),\(AB\)传送带的移动速度为\(P\),\(CD\)传送带的移动速度为\(Q\),步行速度为\(R\),问你从\(A\) ...
- 动态规划专题(三)——数位DP
前言 数位\(DP\) 真的是最恶心的\(DP\). 简介 看到那种给你两个数,让你求这两个数之间符合条件的数的个数,且这两个数非常大,这样的题目一般就是 数位\(DP\) 题. 数位\(DP\)一般 ...
- 在RichTextBox控件中添加超链接文本
实现效果: 知识运用: RichTextBox控件的AppendText方法 public void AppendText{string textData} //向控件中添加文本内容 和Process ...
- 使用 Repeater方式和完全静态页面使用AJAX读取和提交数据
1.使用Repeater方式: Comments.aspx <html xmlns="http://www.w3.org/1999/xhtml"> <head r ...
- vue项目跨域问题
跨域 了解同源政策:所谓"同源"指的是"三个相同". 协议相同 域名相同 端口相同 解决跨域 jsonp 缺点:只能get请求 ,需要修改B网站的代码 cors ...
- nodejs 实现图片上传
1.首先在目录下的运行cmd,执行以下命令 npm install multer; 2.在router下新建upload.js let express = require('express');let ...
- redis redis-cli 操作指令
默认选择 db库是 0 redis-cli -p 6379 查看当前所在“db库”所有的缓存key redis 127.0.0.1:6379> keys * 选择 db库 redis 1 ...
- jQuery具体实例介绍什么时候用ajax,ajax应该在什么地方使用
网站开发时,ajax是一个非常方便的工具,它具有和表单相同的功能完成前端和后台之间的交互!它起到局部刷新的功能!那什么时候用ajax呢?下面给大家介绍几个实例,首先应该分为两类: 一.在用表单和aj ...