添加老师(下拉框多选)
数据库设计:
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‘)
View Code
[oldboy-django][2深入django]老师管理--查看,添加,编辑
标签:oldboy each 解决办法 .text 标签 sele man har 对象