将模板作为字符串返回 - Django

时间:2010-03-29 21:43:05

标签: python django django-models django-templates django-views

我仍然不确定这是解决这个问题的正确方法,也许不是,但无论如何我都会问。我想重写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作为字符串返回,然后将其输入到生成的模板中

我的问题是 - 这是最好的做事方式吗?如果是这样,我该怎么办?如果没有,我应该走哪条路?我对Django很新,所以我还在学习它能做什么,不能做什么,所以请耐心等待。我已经检查了SO的傻瓜,并且不认为之前曾经问过这个......

我也看过Django-cms,看看是否有帮助,但我无法掌握它。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

首先,一些puzzelement。

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

在Django中,所有模型都分配了一个整数主键。

评论没有意义,因为您不需要像这样添加主键。 PageItem已经有了一个主键。

另外,请使用小写字母作为属性。仅对类名使用大写。请。

  

“但是,如果我的页面项目是网站更新而不是博客帖子怎么办?基本上,我想我想要   拉回不同的项目类型   不同的订单并显示它们   使用适当的模板“

不同的类型通常意味着不同的模型。您可能希望将“网站更新”和“博客帖子”作为单独的模型,而不是模糊的“PageItem”。

然后,您可以遍历这些不同的对象并将其显示在模板中。

您可以轻松地使用方法定义各种模型以返回HTML信息。您(通常)不希望返回完全烘焙的HTML。但CSS ID或Class信息有时会有所帮助。

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 :(得分:1)

include模板标记可以包含一个包含要包含的模板的变量,因此您可以遍历包含各种子模板的序列并依次包含它们,也许使用dict将友好名称映射到模板文件名。