Вернуть шаблон в виде строки - Django - PullRequest
1 голос
/ 30 марта 2010

Я все еще не уверен, что это правильный путь, может быть и нет, но я все равно спрошу. Я хотел бы переписать WordPress (оправдание: потому что я могу), хотя проще в Django, и я надеюсь, что смогу по-разному настраивать элементы на странице. Так, например, я мог бы иметь:

  • Блог моделей
  • Модель сообщения об обновлении сайта
  • Последняя модель комментариев.

Теперь для каждой страницы на сайте я хочу, чтобы пользователь мог выбирать порядок и любые элементы, которые на нем идут. В моем мыслительном процессе это будет работать примерно так:

class Page(models.Model)
    Slug = models.CharField(max_length=100)

class PageItem(models.Model)
    Page = models.ForeignKey(Page)
    ItemType = models.CharField(max_length=100) # tells me which model to display
    InstanceNum = models.IntegerField() # tells me which instance of which model...

Тогда, в идеале, мой шаблон должен проходить через все PageItems на странице, что достаточно легко сделать.

Но что, если мой элемент страницы является обновлением сайта, а не постом в блоге? По сути, я думаю, что я хотел бы вернуть разные типы элементов в разные порядки и отобразить их с помощью соответствующих шаблонов. Теперь я подумал, что одним из способов сделать это будет, в views.py, перебрать все объекты и вызвать соответствующую функцию представления, вернуть бит html в виде строки и затем передать это в результирующий шаблон. 1017 *

Мой вопрос - это лучший способ делать что-то? Если да, то как мне это сделать? Если нет, то куда мне идти? Я довольно новичок в Django, поэтому я все еще изучаю, что он может и не может делать, поэтому, пожалуйста, потерпите меня. Я проверил SO на наличие дураков и не думаю, что об этом спрашивали раньше ...

Я также посмотрел на Django-cms, чтобы посмотреть, помогает ли это, но я не смог с этим справиться.

Есть предложения?

Ответы [ 2 ]

2 голосов
/ 30 марта 2010

Сначала немного пуззелемента.

 InstanceNum = models.IntegerField() # all models have primary keys.

В Django всем моделям назначен целочисленный первичный ключ.

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

Также, пожалуйста, используйте строчные буквы для атрибутов. Используйте только верхний регистр для имен классов. Пожалуйста.

"Но что, если мой элемент страницы является обновлением сайта, а не постом в блоге? По сути, я думаю, что хотел бы вытащить разные типы предметов обратно в разные заказы и отображать их используя соответствующие шаблоны "

Разные типы обычно означают разные модели. Вместо расплывчатого «PageItem», вы, вероятно, хотите, чтобы «Обновление сайта» и «Запись блога» были отдельными моделями.

Затем вы можете перебирать эти различные объекты и отображать их в шаблоне.

Вы можете легко определить различные модели с помощью метода для возврата информации HTML. Вы (вообще) не хотите возвращать полностью испеченный HTML. Но информация CSS ID или класса иногда полезна.

class SiteUpdate( models.Model ):
    page = models.ForeignKey(Page)
    item_text = models.CharField(max_length=100)
    item_css_class = models.CharField(max_length=64)

Теперь вы можете сгенерировать это в шаблон с помощью простого <div class="{{item.item_css_class}}">{{item.item_text}}</div> и использовать CSS для обработки деталей форматирования, которые отличают обновление сайта от сообщения в блоге.

1 голос
/ 30 марта 2010

Тег шаблона include может принимать переменную, содержащую шаблон, который нужно включить, так что вы можете циклически проходить по последовательности, содержащей различные суб-шаблоны, и включать их по очереди, возможно, используя dict для сопоставления дружественных имен с именами шаблонов.

...