g:动态选择具有默认值的模板

时间:2018-07-13 23:14:45

标签: python django wagtail

我想知道Wagtail中是否有一种方法可以在基本模型中通过CharField输入自定义模板路径,然后在继承模型中建立一个默认模板。例如:

base / models.py

class WebPage(Page):        
    template_path = models.CharField()

    def get_template(self, request):
        if self.template_path:
            template = template_path
        else:
            template = *something*

app / models.py

class MyWebPage(WebPage):

    template = 'default_template.html'

理想情况下,我将在template模型中建立MyWebPage属性,并将其作为默认属性。但是,get_template基本模型中的WebPage方法将取代它,但前提是它不为空。有可能吗?

1 个答案:

答案 0 :(得分:1)

我正在阅读Wagtail文档,发现了该页面(http://docs.wagtail.io/en/v2.1.1/advanced_topics/third_party_tutorials.html),并且该页面上有一篇有关动态模板的文章。这是具有该页面的页面:https://www.coactivate.org/projects/ejucovy/blog/2014/05/10/wagtail-notes-dynamic-templates-per-page/

这个想法是设置一个CharField并让用户选择他们的模板。在下面的示例中,他们使用下拉菜单,这可能对您更好。

class CustomPage(Page):

    template_string = models.CharField(max_length=255, choices=(
                                         (”myapp/default.html”, “Default Template”), 
                                         (”myapp/three_column.html”, “Three Column Template”,
                                         (”myapp/minimal.html”, “Minimal Template”)))
    @property
    def template(self):
        return self.template_string 

^代码来自coactivate.org网站,这不是我的功劳。

在template属性中,您可以检查if not self.template_string:并在其中设置默认路径。

编辑#1: 添加页面继承。

您可以添加父页面(基类)并对其进行修改,然后使用新的基类扩展任何其他类。这是一个示例:

class BasePage(Page):
    """This is your base Page class. It inherits from Page, and children can extend from this."""

    template_string = models.CharField(max_length=255, choices=(
                                         (”myapp/default.html”, “Default Template”), 
                                         (”myapp/three_column.html”, “Three Column Template”,
                                         (”myapp/minimal.html”, “Minimal Template”)))
    @property
    def template(self):
        return self.template_string 


class CustomPage(BasePage):
    """Your new custom Page."""

    @property
    def template(self):
        """Overwrite this property."""
        return self.template_string 

此外,您可以将BasePage设置为抽象类,这样您的迁移就不会为BasePage创建数据库表(如果仅用于继承)