# 添加老师(下拉框多选)
数据库设计:
class Teacher(models.Model):
name = models.CharField(max_length=64)
cls = models.ManyToManyField('Classes') - Form设置班级输入框为 select多选
- 多选
class TeacherForm(Form):
name = fields.CharField(max_length=16,
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'})
) - ps 单选, 即一个老师只能选择一个班级
class TeacherForm(Form):
name = fields.CharField(max_length=16,
widget=widgets.TextInput(attrs={'class': 'form-control'})
)
cls = fields.ChoiceField(
choices=models.Classes.objects.values_list('id', 'title'),
widget=widgets.Select(attrs={'class': 'form-control'}) 或者:
class TeacherForm(Form):
name = fields.CharField(max_length=16,
widget=widgets.TextInput(attrs={'class': 'form-control'})
)
cls = fields.CharField( widget=widgets.Select(
choices=models.Classes.objects.values_list('id', 'title'),
attrs={'class': 'form-control'}
) - 添加老师页面,form是如何生成多选的html标签的
a.设计数据验证以及html格式
class TeacherForm(Form):
name = fields.CharField(max_length=16,
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'})
)
- 新增老师的时候,如何将提交的数据插入到数据库两张表上(老师表和第三张表)
class_list = obj.cleaned_data.pop('cls')
teacher = models.Teacher.objects.create(**obj.cleaned_data)
teacher.cls.add(*class_list) - 添加老师成功后,跳转到teachers页面,如何显示老师任教班级的数据(老师和班级的关联信息是放在第三张表app01_teacher_cls上)
item.cls是一个objects对象,后面可以接values, all, values_list
{% 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> {% endfor %} # BUG:
分别打开添加老师(或者学生)的页面,和添加班级的页面, 然后再添加班级页面新添加一个班级。
刷选添加老师(或者学生)页面,发现班级下拉框并没有动态增加刚才新增加的班级。 原因分析:出现在class TeacherForm和StudentForm定义上,以TeacherForm为例
class TeacherForm(Form):
name = fields.CharField(max_length=16,
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=16,
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') 学生类似
class StudentForm(Form):
name = fields.CharField(max_length=8, min_length=2,
widget=widgets.TextInput(attrs={'class': 'form-control'})
)
age = fields.IntegerField(max_value=25, min_value=18,
widget=widgets.TextInput(attrs={'class': 'form-control'})
)
email = fields.EmailField(widget=widgets.TextInput(attrs={'class': 'form-control'})
)
cls_id = fields.IntegerField(
# widget=widgets.Select(choices=[(1, '上海'), (2,'北京')])
# choices 类型为[(),()]
widget=widgets.Select(
# choices=models.Classes.objects.values_list('id', 'title'),
attrs={'class': 'form-control'})
) def __init__(self, *args, **kwargs):
super(StudentForm, self).__init__(*args, **kwargs)
self.fields['cls_id'].widget.choices = models.Classes.objects.values_list('id', 'title')

[oldboy-django][2深入django]老师管理--查看,添加,编辑的更多相关文章

  1. [oldboy-django][2深入django]老师管理 -- form表单如何生成多选框标签,多选框的默认值显示,以及多选框数据插入到数据库,多选框数据更改到数据库

    1 form表单如何生成多选框(包含了多选框可选择内容) - Form设置班级输入框为 select多选 - 多选 class TeacherForm(Form): name = fields.Cha ...

  2. 【django小练习之主机管理界面】

    需求: 利用django,js,bootstrap等实现登录,主机管理等操作. 实现截图 登录界面 主机界面,添加及编辑 部门管理界面 代码实现 目录层级 settings.py "&quo ...

  3. Python(Django)项目与Apache的管理

    (开开心心每一天~ ---虫瘾师) Python(Django)项目交给Apache的管理(一) 准备:Django的环境(Python).Apache.Wsgi(必须文件) 首先需要电脑有Pytho ...

  4. Python(Django)项目与Apache的管理交互

    (开开心心每一天~ ---虫瘾师) Python(Django)项目交给Apache的管理(一) 准备:Django的环境(Python).Apache.Wsgi(必须文件) 首先需要电脑有Pytho ...

  5. django中怎么使用自定义管理后台xadmin

    django中怎么使用自定义管理后台xadmin 2018年05月19日 15:48:08 LH_python 阅读数:1001   首先创建基本的django项目,配置好基本的model ,url, ...

  6. Linux下开发python django程序(设置admin后台管理模块)

    1.新建项目和项目下APP django-admin startproject csvt03 django-admin startapp app1 2.修改settings.py文件 设置默认安装AP ...

  7. Django的Mov逻辑的管理特色

    Django的MOV逻辑的管理特色 首先我们谈论到一个逻辑上的概念都从它的起点说起,在我看来mov的起点肯定就是Model了,那么Model有什莫特色呢 如果一个项目定义的Django那么Django ...

  8. day 57 Django基础五之django模型层之关联管理器

    Django基础五之django模型层之关联管理器   class RelatedManager "关联管理器"是在一对多或者多对多的关联上下文中使用的管理器.它存在于下面两种情况 ...

  9. Django基础-003 配置Django自带的后台管理,操作数据库

    插入测试数据,可以自己写页面来插入数据 也可以使用Django自带的后台管理,来操作数据表 1.创建用户 python manage.py createsuperuser 2.在浏览器输入地址,进入D ...

随机推荐

  1. IOS 九宫图解锁(封装)

    NJLockView.h /.m @class NJLockView; @protocol NJLockViewDelegate <NSObject> - (void)lockViewDi ...

  2. 【51nod1299】监狱逃离(树形DP)

    点此看题面 大致题意: 在一棵树中有\(N\)条边连接\(N+1\)个节点,现在已知这棵树上的\(M\)个节点,要求封住最少的节点,使这\(M\)个节点中的任意一个节点无法到达叶子节点,若能办到输出最 ...

  3. fdisk - Linux分区表操作工具软件

    总览 fdisk [-u]设备名 fdisk -l [-u] [设备名 ...] fdisk -s分区 ... fdisk -v 描述 硬盘可以被分成一个或多个逻辑磁盘,称为 分区. 这些分区信息都存 ...

  4. 解决linux系统CentOS下调整home和根分区大小《转》

    转自http://www.php114.net/2013/1019/637.html 目标:将VolGroup-lv_home缩小到20G,并将剩余的空间添加给VolGroup-lv_root   1 ...

  5. 新装Ubuntu后的一些配置

    一:Ubuntu 16.04 开启root用户和使用root用户登陆 1. 编辑/etc/lightdm/lightdm.conf autologin-guest=false autologin-us ...

  6. C/C++程序基础 (五)位运算

    C++中四种转换运算符的区分 const_cast 修改const和volatile属性 reinterpret_cast 指针间类型转换或者指针和整形的转换.二进制重新翻译. static_cast ...

  7. 5- vue django restful framework 打造生鲜超市 -完成商品列表页(上)

    使用Python3.6与Django2.0.2(Django-rest-framework)以及前端vue开发的前后端分离的商城网站 项目支持支付宝支付(暂不支持微信支付),支持手机短信验证码注册, ...

  8. js数组中去重对象

    var allCourses = new Array();var coursesId = new Array();function findCourses() { Courses.data().eac ...

  9. Python_列表、字典、字符串、集合操作

    一.list Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素.对于list的操作,我们要学会增删改查. 查 我们可以直接索引查找,也可以通过切片 ...

  10. Android 性能篇 -- 带你领略Android内存泄漏的前世今生

    基础了解 什么是内存泄漏? 内存泄漏是当程序不再使用到的内存时,释放内存失败而产生了无用的内存消耗.内存泄漏并不是指物理上的内存消失,这里的内存泄漏是指由程序分配的内存但是由于程序逻辑错误而导致程序失 ...