将模板作为字符串返回 - Django
我现在还不太确定这样做是不是正确的方式,可能不是,但我还是想问一下。我想用Django重新写一个更简单的WordPress(理由是:因为我可以),并且希望能够在页面上以不同的方式配置元素。比如说,我可能会有:
- 博客模型
- 网站更新消息模型
- 最新评论模型。
现在,对于网站上的每个页面,我希望用户能够选择这些元素的顺序以及要放哪些元素。在我的想法中,这样做大概是:
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...
然后,理想情况下,我的模板会遍历页面中的所有页面元素,这个操作其实挺简单的。
但是,如果我的页面元素是网站更新而不是博客文章呢?基本上,我在想我想要以不同的顺序提取不同类型的元素,并使用合适的模板来展示它们。现在,我想到了一个方法,就是在views.py
中遍历所有对象,调用相应的视图函数,返回一段HTML作为字符串,然后把它放进最终的模板里。
我的问题是——这样做是最好的方法吗?如果是的话,我该怎么做?如果不是,我应该怎么做?我对Django还比较陌生,所以还在学习它能做什么和不能做什么,请多多包涵。我查过Stack Overflow,觉得这个问题之前没有被问过……
我也看过Django-cms,想看看它是否能帮上忙,但我没能弄明白。
有什么建议吗?
2 个回答
首先,来点小问题。
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来处理格式细节,以区分网站更新和博客文章。
include
模板标签可以接收一个变量,这个变量里放的是要包含的模板。因此,你可以通过一个循环来遍历一系列不同的子模板,并一个一个地把它们包含进来。你也可以使用字典来把好听的名字和模板文件名对应起来。