当前位置:Gxlcms > 数据库问题 > [oldboy-django][2深入django]老师管理--查看,添加,编辑

[oldboy-django][2深入django]老师管理--查看,添加,编辑

时间:2021-07-01 10:21:17 帮助过:21人阅读

添加老师(下拉框多选) 数据库设计: 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   对象   

人气教程排行