Разбор json вернулся в django modelformset в шаблоне - PullRequest
0 голосов
/ 20 ноября 2018

Одним из полей, возвращаемых в мой шаблон в наборе форм, сгенерированном 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)

1 Ответ

0 голосов
/ 21 ноября 2018

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

Новый фильтр 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 - это текст, хотя json находится в БД, поэтому для его анализа необходимо преобразование обратно.

...