zoukankan      html  css  js  c++  java
  • [oldboy-django][2深入django]老师管理--查看,添加,编辑

    # 添加老师(下拉框多选)
        数据库设计:
               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
  • 相关阅读:
    琴生(Jensen)不等式
    基本不等式
    集成学习之梯度提升树(GBDT)
    EM 算法原理
    FSMC驱动8位TFT
    GitHub 上有什么嵌入式方面的项目?
    在SPI_FLASH上建立文件系统
    百为STM32开发板教程——从LED流水灯到UCGUI手机界面
    STM32F1_外部NorFlash存储程序代码
    nor flash之擦除和写入
  • 原文地址:https://www.cnblogs.com/liuzhipenglove/p/7875432.html
Copyright © 2011-2022 走看看