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')) )