Django中如何将GET请求携带的用户数据回填到表单中?
问题根源
你出现KeyError和回填失效的问题有两个核心错误:
- 你重写表单
__init__方法时,强行从kwargs中弹出departure_airport和arrival_airport两个键,但你实例化表单时是把参数字典作为位置参数传入的,这部分参数不会进入kwargs,自然找不到对应键抛出KeyError。 super.__init__(*args, **kwargs)的调用写法错误,正确的调用应该是super().__init__(*args, **kwargs),需要加括号实例化父类。
更重要的是:Django原生表单本身就支持传入请求参数(GET/POST都适用)自动回填字段值,你完全不需要额外重写__init__方法,属于多余操作。
解决方法
第一步:删除表单类中自定义的__init__方法
修正后的表单代码如下:
class FlightSearchForm(forms.Form): departure_airport = forms.CharField(max_length=100) arrival_airport = forms.CharField(max_length=100)
第二步:简化视图逻辑
直接把request.GET传给表单即可,Django会自动判断是否有参数,有参数就自动绑定回填,无参数就返回空表单:
def index(request): # request.GET为空时传入None,表单为未绑定的空状态 form = FlightSearchForm(request.GET or None) return render(request, 'app1/index.html', {'form': form})
第三步:模板正常渲染表单即可
模板中正常使用表单字段渲染,比如:
<form method="get" action=""> {{ form.as_p }} <button type="submit">搜索航班</button> </form>
Django会自动把GET参数中的对应值填充到表单字段的value属性中,实现回填效果。
内容的提问来源于stack exchange,提问作者Kamila
相关产品推荐
相关产品推荐

