代码之家  ›  专栏  ›  技术社区  ›  user257111

以字符串形式返回模板-django

  •  1
  • user257111  · 技术社区  · 15 年前

    我仍然不确定这是正确的方法,也许不是,但我还是会问。我想重新编写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...
    

    然后,理想情况下,我的模板将循环访问页面中的所有页面项,这很容易做到。

    但是如果我的页面项目是网站更新而不是博客文章呢?基本上,我想把不同的项目类型按不同的顺序拉回来,并使用适当的模板显示出来。现在,我想这样做的一个方法是, views.py ,若要循环访问所有对象并调用适当的视图函数,请以字符串形式返回一点HTML,然后将其传输到结果模板中。

    我的问题是——这是做事情的最佳方式吗?如果是,我该怎么做?如果没有,我该走哪条路?我对姜戈还很陌生,所以我还在学习它能做什么,不能做什么,所以请容忍我。我已经查过了,所以没人问过这个…

    我也看了一下django cms,看看这是否有帮助,但我还是没法理解。

    有什么建议吗?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Ignacio Vazquez-Abrams    15 年前

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

        2
  •  2
  •   S.Lott    15 年前

    首先,一些令人费解的元素。

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

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

    注释没有意义,因为您不需要添加这样的主键。pageItem已具有主键。

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

    “但是如果我的页面项目是网站更新而不是博客文章呢?基本上,我想我想 重新拉入不同的项目类型 不同的命令并显示它们 使用适当的模板”

    不同的类型通常意味着不同的型号。与含糊不清的“pageitem”不同,您可能希望将“site update”和“blog post”作为单独的模型。

    然后可以迭代这些不同的对象,并在模板中显示它们。

    您可以使用返回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处理区分网站更新与博客文章的格式细节。