解析json在模板中的django modelformset中返回

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解析json在模板中的django modelformset中返回相关的知识,希望对你有一定的参考价值。

在由modelformset_factory()生成的formset中返回到我的模板的字段之一是JSONField。我想解析json并在表单中单独显示元素,只读。

如果我只使用我创建的内置过滤器get()返回查询集列表,这很容易做到。但它必须采用一种形式,为用户填充一些附加字段。

{% for foo in foo_list %}
  <h5>{{ foo.json|get:"title" }}</h5>
{% endfor %}

问题是对formset字段做同样的事情我得到错误“'BoundField'对象没有属性'get'”

{% for form in formset %}
  <h5>{{ form.json|get:"title" }}</h5>
{% endfor %}

这是过滤器:

@register.filter(name='get')
def get(d, k):
    print('get(d,k):',d,k)
    return d.get(k, None)

视图的相关位:

...
foo_list = Foo.objects.all()
...
FooFormset = modelformset_factory(
    Foo, fields = ['task_id','authority','dataset','place_id',
        'authrecord_id','json'], form=FooModelForm, extra=0)
formset = FooFormset(request.POST or None, queryset=foo_list)
context['formset'] = formset
...
return render(request, 'datasets/review.html', context=context)
答案

我发现将自定义过滤器应用于form.json.value就可以了。新过滤器将该(文本)值转换为json,我可以从中为特定键执行get操作。

新的过滤器:

@register.filter(name='get')
def get(d, k):
    jd = json.loads(d)
    return jd.get(k, None) 

及其在模板中的实现:

{{ form.json.value|get:"names" }}

BoundField.value是文本,即使db中有json,也需要转换回来进行解析。

以上是关于解析json在模板中的django modelformset中返回的主要内容,如果未能解决你的问题,请参考以下文章

将 JSON 对象解析为 Django 模板

在Django模板中使用json数据

如何解析json数据并将其加载到django模板

在 Django 模板中的 JSON 中安全地使用带有 html 的 JSON

Django-模板中的Json数据

Django在模板中的相关模型调用上“无法解析余数”