我想知道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
方法将取代它,但前提是它不为空。有可能吗?
答案 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创建数据库表(如果仅用于继承)