我正在尝试使用包含的Django站点框架创建多站点 Wagtail项目。我无法在Wagtail文档中找到如何单独为每个站点提供模板和静态服务。有人能帮我提供建议或链接到某个教程吗?谢谢。
发布于 2019-05-19 15:49:51
在Wagtail中,视图逻辑存在于页面模型上。当请求发出时,Wagtail url解析器将调用页面serve方法。Wagtail代码表单wagtail.core.models.Page如下所示:
def get_template(self, request, *args, **kwargs):
if request.is_ajax():
return self.ajax_template or self.template
else:
return self.template
def serve(self, request, *args, **kwargs):
request.is_preview = getattr(request, 'is_preview', False)
return TemplateResponse(
request,
self.get_template(request, *args, **kwargs),
self.get_context(request, *args, **kwargs)
)要回答您的问题:您必须重写get_template并添加一些逻辑使模板名称在每个站点上都是唯一的。这是未经测试的代码,但您有这样的想法:
class SomePage(Page):
...
def get_template(self, request, *args, **kwargs):
return request.site + super().get_template(request, *args, **kwargs)现在,模板名以站点为前缀。因此,您只需要提供具有正确名称的模板。
发布于 2020-09-02 10:13:31
在Wagtail 2.10中,此方法不再有效,已不再推荐request.site
相反,你可以这样做:
class SomePage(Page):
...
def get_template(self, request, *args, **kwargs):
return Site.find_for_request(request).site_name + '/' + super().get_template(request, *args, **kwargs)如果需要引用ajax模板,也可以使用以下方法:
class SomePage(Page):
...
ajax_template = 'ajax_foo.html'
template = 'foo.html'
def get_template(self, request, *args, **kwargs):
template = Site.find_for_request(request).site_name + '/' + self.template
if request.is_ajax():
template = Site.find_for_request(request).site_name + '/' + self.ajax_template
return template发布于 2022-09-11 18:08:31
在allcaps回答的基础上,我创建了一个简单的代理模型,所有的Page模型都是从它继承的。考虑一个名为BlogPage的页面
class SitePage(Page):
def get_template(self, request):
template_name = super().get_template(request)
domain = request.get_host()
if settings.DEBUG:
if not domain.startswith('localhost'):
domain = domain.split('.localhost')[0]
return [
domain + '/' + template_name,
template_name,
]
class Meta(Page.Meta):
abstract = True
class BlogPage(SitePage):
...现在,我可以拥有一个类似于以下内容的templates/文件夹:
templates/
domain1.com/
blog_page.html
domain2.com/
blog_page.html
domain3.com/
blog_page.html如果您为每个域配置了一个Wagtail Site,这将根据域名应用正确的模板。
还有几个额外的特性:
localhost,这样您就可以转到domain1.com.localhost:8000,它将找到domain1.com的模板。https://stackoverflow.com/questions/56113922
复制相似问题