Разбор json, возвращенный в django modelformset в шаблоне

Одно из полей, возвращаемых в мой шаблон в наборе форм, сгенерированном modelformset_factory(), — это JSONField. Я хотел бы разобрать json и отображать в нем элементы отдельно внутри формы, только для чтения.

Это легко сделать, если я просто верну список наборов запросов, используя созданный мной встроенный фильтр get(). Но это должно быть в форме, в которой есть несколько дополнительных полей для заполнения пользователями.

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

Проблема в том, что, делая то же самое для поля набора форм, я получаю сообщение об ошибке «Объект 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)

person kgeo    schedule 20.11.2018    source источник
comment
Но это не имеет смысла. foo — это форма, а foo.json — это поле: это место для ввода JSON в строковом формате. На самом деле это не сам JSON. Чего вы пытаетесь достичь здесь?   -  person Daniel Roseman    schedule 21.11.2018
comment
Я не был ясен; foo в первом случае является элементом в foo_list, а foo.json является объектом json. Но этот первый бит не связан с формами. Проблема заключается в следующем — рендеринг значения BoundField в шаблоне. Я нашел ответ в старой ветке патчей — BoundField.value, описанной в моем ответе ниже. Спасибо   -  person kgeo    schedule 21.11.2018


Ответы (1)


Я обнаружил, что применение пользовательского фильтра к form.json.value помогло. Новый фильтр преобразует это (текстовое) значение в json, из которого я могу получить определенные ключи.

новый фильтр получения:

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

и его реализация в шаблоне:

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

BoundField.value - это текст, хотя json в БД, поэтому для синтаксического анализа требуется обратное преобразование.

person kgeo    schedule 20.11.2018