Django form表单中foreignkey无法实时更新数据源

问题描述:

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

第一种方法更灵活,推荐第一种方法,比如通过其他接口获取数据,或者查询操作由专门的数据库写

上一篇:Python 垃圾回收机制

下一篇:Django form表单下拉选框中过滤当前用户