Имя поля и значение в шаблоне - PullRequest
0 голосов
/ 05 ноября 2018

Я хотел бы отобразить что-то подобное в моем шаблоне:

Имя : Джон

Возраст : 18

Город : Нью-Йорк

Используя, например, этот код:

views.py

def person_details(request,pk):
   person = get_object_or_404(Person, id=pk)
   return render(request, 'template.html', {'person': person, 'person_fields': person._meta.get_fields()})

template.html

{% for field in person_fields %}        
     <div class="col-4 form-group">            
         <p><strong>{{ field.verbose_name }}:</strong> {{ person[ field.name ]  }}</p>             
     </div>
{% endfor %}

Возможно ли это в python? Я спрашиваю, потому что у меня есть модель, которая имеет около 20 полей, и жесткое кодирование полей в шаблоне будет немного сложным.

Ответы [ 2 ]

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

Шаблоны Django намеренно ограничены, так что написание бизнес-логики сложно (или почти невозможно). Обычно такую ​​логику выполняют на уровне модели или вида.

def person_details(request, pk):
    person = get_object_or_404(Person, id=pk)
    person_data = {
       f.verbose_name: getattr(person, f.name, None)
       for f in person._meta.get_fields()
    }
    return render(request, 'template.html', {'person': person, 'person_data': person_data })

, а затем отрендерить его с помощью:

{% for ky, val in person_data.items %}
     <div class="col-4 form-group">            
         <p><strong>{{ ky }}:</strong> {{ val }}</p>             
     </div>
{% endfor %}

Однако рекомендуется не , чтобы выполнить эту сериализацию самостоятельно, но использовать другие методы сериализации, такие как , перечисленные в этом ответе .

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

Вы можете использовать сериализатор наборов запросов Django to-python .

Просто введите следующий код:

from django.core import serializers
data = serializers.serialize( "python", SomeModel.objects.all() )

А потом в шаблоне:

{% for instance in data %}
    {% for field, value in instance.fields.items %}
        {{ field }}: {{ value }}
    {% endfor %}
{% endfor %}

Его большое преимущество заключается в том, что он обрабатывает поля отношений.

Для подмножества полей попробуйте:

data = serializers.serialize('python', SomeModel.objects.all(), fields=('name','size'))
...