Эквивалент метода 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.

Недостатком теперь является то, что каждая модель должна иметь точно такой же метод, добавленный в ее класс. Мне не нравится повторяющийся код, но это придется сделать, пока я не найду более чистый способ.

Вернуться на верх