Эквивалент метода Django as_p() для случаев использования не в форме / только на дисплее
У меня есть несколько моделей с 10+ полями в каждой. Во время первой стадии разработки я меньше беспокоюсь о том, как все выглядит, и стараюсь как можно скорее добраться до критических компонентов кода. Мне нравится метод myForm.as_p, встроенный в объект Forms. Главное преимущество заключается в том, что я могу изменять модели по мере необходимости, делать миграции, и as_p будет показывать новые поля без необходимости изменять шаблон.
Мой вопрос: существует ли эквивалентный метод для случаев использования только дисплея?
Я пытался прочесать документацию, но не нашел ничего за пределами форм. Идеальным было бы что-то вроде DetailView на основе класса, который в шаблоне может использовать {{ object.as_p }}. Кто-нибудь знает подобную функцию динамического отображения вне форм?
TLDR: Я создал метод "as_div" в классе модели для модели, которую я хочу отобразить, и перебрал все поля с помощью набора тегов из двух колонок. Вот метод:
models.py
...
from django.utils.safestring import mark_safe
...
class myModel(Model):
...
def as_div(self):
# build the HTML representation of the model instance
html = "<div class='modelInstance'>"
for field in self._meta.fields:
html += "<div style='display: flex; width: 30%'>"
html += "<div style='flex: 1'>" + field.verbose_name + "</div>"
html += "<div style='flex: 1'>" + str(getattr(self, field.name)) + "</div>"
html += "</div>"
html += "</div><hr />"
return mark_safe(html)
Затем я использовал это имя метода (as_div) в шаблоне HTML следующим образом: myModel.html
myModels.py
...
{% for myModel in myModels %}
{{ myModel.as_div }}
{% endfor %}
Я наткнулся на this при изучении вспомогательного тега "as_div", используемого в API django.forms. Согласно документации:
Шаблон, используемый функцией as_div(). По умолчанию: 'django/forms/div.html'
.
Поэтому я подумал, а могу ли я просто создать шаблон в папке django/models/ и ссылаться на него, как это делается для форм? Оказывается, это даже проще. Когда вы хотите манипулировать моделью на уровне строк (экземпляров), вы просто добавляете метод в класс модели. Итак, я написал вышеприведенный метод, и на веб-странице появилась куча тегов. Упс. Оказывается, вам нужно пометить его как безопасный с помощью библиотеки django.utils.safestring. Тогда он будет отображаться как настоящий HTML.
Недостатком теперь является то, что каждая модель должна иметь точно такой же метод, добавленный в ее класс. Мне не нравится повторяющийся код, но это придется сделать, пока я не найду более чистый способ.