将 JSONField 解压缩到多个 django 表单字段中

Posted

技术标签:

【中文标题】将 JSONField 解压缩到多个 django 表单字段中【英文标题】:Unpacking a JSONField into multiple django form fields 【发布时间】:2019-02-11 04:51:28 【问题描述】:

我在我的 Django 模型中使用来自 django.contrib.postgres.fields 的 JSONField。我想设置我的更新表单,以便它查看传递给它的对象,从 JSON 字段遍历 JSON,并动态创建适量的 CharFields。

models.py:

class myclass(models.Model):
    purpose_section = JSONField()

forms.py:

class myclassForm(forms.ModelForm):
    class Meta:
        model = myclass
        fields = '__all__'

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        for i in self.fields['purpose_section'].initial:
            self.fields['purpose_section_%s' % i] = forms.CharField(label="purpose_section_" + i,value=i.content)

当我尝试访问该页面时,我收到一个错误: “NoneType”对象不可迭代

关于我缺少什么的任何想法?

【问题讨论】:

【参考方案1】:

我不确定您使用的是什么视图,但假设它是一个将传递您尝试编辑的数据库行实例的视图(例如带有将 pk 传递给它的 URL 的 UpdateView) ,

你可以在你的表单中试试这个:

for key in self.instance.purpose_section:
   self.fields[key] = forms.CharField(label=key, max_length=256)
   self.fields[key].initial = self.instance.purpose_section[key]

如果您不使用执行此操作的视图,则需要自己传递实例。

【讨论】:

以上是关于将 JSONField 解压缩到多个 django 表单字段中的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何从 bradjasper 的 django-jsonfield 升级到 Django 的内置 jsonfield?

Django JSONField isnull 查找

django jsonfield 保存到数据库

Django中的JSONField即使在POST请求后仍保持为空

使用 django 查询 set values() 索引到 JSONField

Django:在过滤器和搜索中使用 JSONField 属性