Django-Form表单验证-无法动态显示数据BUG

 Form表单刷新数据无数据显示:

BUG背景:

  简单的学员管理系统中:

  A.classes 班级页面

  B.student 学员页面

  1、在【添加学生】页面中,所有添加的input框和Select下拉框都是由Form动态生成,下拉框的下拉内容是classes的title属性。

  

 

2、然后再在数据库中添加新的classes对象C++

+----+--------+

| id | title  |

+----+--------+

|  1 | Java   |

|  2 | Python |

|  3 | Lua    |

|  4 | C++    |

|  5 | PHP    |

+----+--------+

 然后刷新add_student:

发生了什么!数据没有更新!why!

重新查看student_Form类:

class student_Form(Form):
    name = fields.CharField(min_length=4,max_length=32,
                            widget=widgets.TextInput(attrs={'class':"form-control" ,
                                                            'placeholder':"name"}))
    email = fields.EmailField(max_length=32,
                              widget=widgets.TextInput(attrs={'class': "form-control",
                                                              'placeholder': "email"}))

    age = fields.IntegerField(max_value=100,min_value=1,
                              widget=widgets.TextInput(attrs={'class': "form-control",
                                                              'placeholder': "age"}))

    classes_id=fields.IntegerField(
        widget=widgets.Select(choices=models.Classes.objects.values_list('id','title'))
    )

原来在类中,name、email、age、cls_id都是静态成员变量,所以只初始化一次,而在student_Form中,下拉框的数据一直都是第一次获取的数据,所以不会随着数据库更新而更新。

解决方案:
  1、重新启动(开完笑哈😆)
  2、在每一次对象实例化的时候,给他重新赋值!
from django.forms import Form,fields,widgets
class student_Form(Form):
    name = fields.CharField(min_length=4,max_length=32,
                            widget=widgets.TextInput(attrs={'class':"form-control" ,
                                                            'placeholder':"name"}))
    email = fields.EmailField(max_length=32,
                              widget=widgets.TextInput(attrs={'class': "form-control",
                                                              'placeholder': "email"}))

    age = fields.IntegerField(max_value=100,min_value=1,
                              widget=widgets.TextInput(attrs={'class': "form-control",
                                                              'placeholder': "age"}))

    cls_id=fields.IntegerField(
        widget=widgets.Select(choices=models.Classes.objects.values_list('id','title'))
    )

    def __init__(self,*args,**kwargs):
        super(student_Form, self).__init__(*args,**kwargs)
   # 因为choice是cls_di中的widget中的属性,所以需要通过widget.choices来获赋值,如果choice不在widget中,则可以略过widget直接通过choice重新赋值
1、 self.fields[
'cls_id'].widget.choices=models.Classes.objects.values_list('id','title') 2、 self.fields['cls_id']=fields.IntegerField( widget=widgets.Select(choices=models.Classes.objects.values_list('id','title'))     )

 













 

posted @ 2017-09-28 22:07  LeeeetMe  阅读(325)  评论(0编辑  收藏  举报