django Wagtail -在同一个页面模型中使用不同的模板

4zcjmb1e  于 2023-05-30  发布在  Go
关注(0)|答案(1)|浏览(133)

我正在使用Wagtail/Django创建一个网站。
我的大部分页面都是由一些文本组成,后面是用Bokeh生成的图表或表格。
我发现在每个页面上添加散景和代码的方法是使用自定义模板标签。我创建了一个输出散景代码的函数,并使用模板标记调用此函数。
因此,本网站中的典型模板如下所示:

{% load customtemplatetag %}

{% block content %}
<div class="container py-4">    
    <h1>
    {{ page.header|richtext }}
    </h1>
    <p class="lead">
    {{ page.plead|richtext }}    
    </p>
    {% bokehgraph as bokehg %}
    {{ bokehg.1| safe }}    
    {{ bokehg.0| safe }}  
</div>
{% endblock %}

因此,我有一个页面模型,为每种不同类型的散景输出提供专用模板。
这似乎不是最好的方式。
有没有什么方法可以让我在不同的模板中使用相同的模型,或者是一种完全不同的方法,使我能够使用更少的页面模型和更少的模板?

**编辑:**跟进Richard艾伦的评论:

我有不同的模板标签,返回不同的图形。我的customtemplatetag文件看起来像:

register = template.Library()

@register.simple_tag
def bokehgraph():
    
    Loads data from database1
    Generates graph with Bokeh      

    return components(layout)

@register.simple_tag
def bokehgraph2():

    Loads data from database2
    Generates another graph with Bokeh      

    return components(layout)

.1和.2属性是由Bokeh组件生成的<div><script>
我需要的是能够从Wagtail CMS选择,如果bokehgraph或bokegraph 2将被称为一个给定的页面。
我现在的解决方案是有两个模型,两个模板。一个模板调用bokegraph,另一个调用bokehgraph 2。

huus2vyu

huus2vyu1#

我假设这两种图形类型具有非常不同的输入,因此不能使用相同的参数选项。
与其创建两个页面模型,不如创建一个StreamField,每个图类型有一个块类型(目前有2个,但您可以通过这种方式添加更多)。如果你只想要一页一个图形,那么你可以设置最小/最大块值。由于您可以为块指定前端模板,因此此逻辑将从页面模板中取出。
因此,如果这两个图被称为类型A和类型B,你可以这样做:

class TypeAGraphBlock(StructBlock):
    ... block attributes ...
    
    class Meta:
        template = 'blocks/graph_type_a_block.html'
        label = _("Type A Graph")
        icon = 'some icon'

class TypeBGraphBlock(StructBlock):
    ... block attributes ...
    
    class Meta:
        template = 'blocks/graph_type_b_block.html'
        label = _("Type B Graph")
        icon = 'some other icon'

class YourPage(Page):
    ... page attributes ...

    graph = StreamField(
        [
            ("type_a_graph", TypeAGraphBlock()),
            ("type_b_graph", TypeBGraphBlock()),
        ],
        verbose_name="Graph",
        min_num=1, 
        max_num=1,
        use_json_field=True
    )

    ... rest of page definition ...

相关问题