码迷,mamicode.com
首页 > 数据库 > 详细

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

时间:2017-11-21 23:53:44      阅读:213      评论:0      收藏:0      [点我收藏+]

标签:oldboy   each   解决办法   .text   标签   sele   man   har   对象   

技术分享图片
# 添加老师(下拉框多选)
    数据库设计:
           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   对象   

原文地址:http://www.cnblogs.com/liuzhipenglove/p/7875432.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!