You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 14:27:03