Django中如何基于请求传递的ID使用JSONSchemaField创建动态表单?
问题根源
你当前代码中的type_json_schema查询逻辑、add_asset字段定义都是类级别的属性,这部分代码会在Django首次加载AssetAddjsonForm类的时候就执行,此时表单实例还未初始化,__init__方法还没有被调用,完全拿不到动态传入的id参数,所以只有写死固定id时才能生效。
解决方案
把schema查询和字段定义的逻辑从类级别移到__init__实例初始化方法中,动态给表单添加字段即可,修改后的forms.py代码如下:
from django.forms import Form from django_jsonforms.forms import JSONSchemaField # 可选:加异常捕获避免id不存在时报错 from django.core.exceptions import ObjectDoesNotExist class AssetAddjsonForm(Form): def __init__(self, *args, **kwargs): # 取出传入的动态id,此处将变量名改为asset_type_id避免和请求对象request混淆 self.asset_type_id = kwargs.pop('id') super(AssetAddjsonForm, self).__init__(*args, **kwargs) # 查询动态id对应的schema try: type_json_schema = Types.objects.values_list('details').get(id=self.asset_type_id)[0] except ObjectDoesNotExist: # 匹配不到对应记录时可以设置默认schema,或者自定义业务逻辑处理异常 type_json_schema = {} # 动态添加字段到表单实例的fields字典中 # 注意确保options变量在当前作用域可访问 self.fields['add_asset'] = JSONSchemaField(schema=type_json_schema, options=options)
注意事项
- 你的
views.py逻辑不需要做任何修改,保持原有传参方式即可 - 确保代码中的
options变量在__init__方法的作用域内可以正常访问,如果options之前定义为类属性,访问时改为self.options即可
内容的提问来源于stack exchange,提问作者siddik bharath
相关产品推荐
相关产品推荐

