Django开发中如何将views.py获取的值传递给forms.py表单类
Django视图传参到表单类的实现方案
Django表单的类属性是服务启动加载类时就初始化完成的,无法直接拿到请求阶段的动态参数,需要通过重写表单的__init__方法接收动态参数,再动态赋值字段选项,具体修改如下:
1. 修改forms.py代码
重写表单类的初始化方法,将原本写在字段定义里的choices生成逻辑移到初始化方法中,通过自定义参数接收视图传来的集群名称:
class getPodsOnNodes(forms.Form): # 类定义阶段先给choices传空列表占位,不要在这里写动态逻辑 nodeName = forms.ChoiceField(label='Node Name', choices=[]) def __init__(self, *args, clusterName=None, **kwargs): # 先执行父类Form的初始化逻辑 super().__init__(*args, **kwargs) # 用传入的clusterName动态生成下拉选项 if clusterName: self.fields['nodeName'].choices = functions.choiceMaker( functions.nodesList(clusterName) ) # 可选:参数为空时给兜底选项,避免下拉框无内容报错 else: self.fields['nodeName'].choices = [("", "请先选择对应集群")]
2. 修改views.py代码
实例化表单对象时,把从GET请求里拿到的clusterName作为关键字参数传入表单即可:
def pods(request): clusterName = request.GET.get('data') # 实例化表单时传入自定义参数 return render(request,'pods.html',{"nodeForm": forms.getPodsOnNodes(clusterName=clusterName)})
注意事项
- 如果该视图同时处理POST表单提交,实例化表单时正常传
request.POST即可,自定义的clusterName参数不会受影响,写法示例:def pods(request): clusterName = request.GET.get('data') if request.method == "POST": nodeForm = forms.getPodsOnNodes(request.POST, clusterName=clusterName) # 后续执行表单校验逻辑 else: nodeForm = forms.getPodsOnNodes(clusterName=clusterName) return render(request,'pods.html',{"nodeForm": nodeForm}) - 不要尝试在类字段定义位置直接引用外部动态变量,该段代码仅在Django服务启动时执行一次,无法拿到每次请求的不同参数值,所有动态修改字段属性、生成选项的逻辑都要放到
__init__方法中实现。
内容的提问来源于stack exchange,提问作者Nima Maghsoodi
相关产品推荐
相关产品推荐

