问题描述:
当form表单中存在外键字段时在前端渲染时是多选的下拉框,此时如果后台更新了数据,比如多了一个选项,前端刷新并不能实时更新数据,如提交表单之前时刷新,数据并没有更新过来。
看例子:
def class_add(request):
if request.method == 'GET':
class_form = ClassForm()
return render(request, 'add_class.html', {'class_form':class_form})
else:
class_form = ClassForm(data=request.POST)
if not class_form.is_valid():
return render(request, 'add_class.html', {'class_form':class_form})
ClassList.objects.create(**class_form.cleaned_data)
return redirect('class_list')
forms.py
class ClassForm(Form):
caption = fields.CharField(error_messages={'required':'班级名称不能为空'})
headmaster_id = fields.ChoiceField(choices=UserInfo.objects.filter(ut_id=2).values_list('id', 'username'))
上面的class_add视图函数中,在提交表单前有实例化表单,class_form=ClassForm(data=request.POST),但数据并没有实时更新。
解决办法:
方式1:
class ClassForm(Form):
caption = fields.CharField(error_messages={'required': '班级名称不能为空'})
headmaster_id = fields.ChoiceField(choices=[]) # 因为重写了构造方法,这里可以空着或者不写
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# 所有字段都封装在fields中,不能直接self.headmaster_id
self.fields['headmaster_id'].choices = UserInfo.objects.filter(
ut_id=2).values_list('id', 'username')
这样每次实例化时都会重新查询一次数据库,达到数据源更新的目的。
方式2:
rom django.froms.models import ModelChoiceField
class ClassForm(Form):
caption = fields.CharField(error_messages={'required': '班级名称不能为空'})
# 为了方便存数据库,数据库存什么这里写什么
# headmaster_id = fields.ChoiceField(choices=[])
headmaster_id = ModelChoiceField(queryset=UserInfo.objects.filter(ut_id=2))
第一种方法更灵活,推荐第一种方法,比如通过其他接口获取数据,或者查询操作由专门的数据库写