Base Templates¶
This describes the base templates. When creating a custom page template, you most often need to inherit from one of these:
Note
Any of these templates may be overridden; see Overriding the Search Paths.
Global Base¶
There is exactly one “true base template” for the web app, designated
as: /base.mako
The default base template is wuttaweb:templates/base.mako
and all
page templates inherit from it. However they inherit it by name
only (/base.mako
) - therefore if you override this via custom
template search paths, effectively you have changed the theme.
In addition to general layout/structure, this template is reponsible
for creating the Vue app which encompasses the whole of every page.
It also establishes the WholePage
component which is the Vue app’s
one and only child component.
(WholePage
in turn will have other children, for page content.)
There is usually no need to define a template which inherits directly
from /base.mako
, rather you should inherit from /page.mako
(see next section) or similar.
As pertains to Vue component logic, there are 3 blocks which you may
find a need to override. These are defined by /base.mako
so will
apply to all templates:
render_vue_templates()
modify_vue_vars()
make_vue_components()
Most often it is necessary to customize modify_vue_vars()
but keep
reading for an example.
Page Base¶
The common base template for pages, designated as: /page.mako
This extends the Vue logic from /base.mako
by establishing
ThisPage
component, which wraps all content within the current
page.
The final structure then is conceptually like:
<div id="app">
<whole-page>
<!-- menu etc. -->
<this-page>
<!-- page contents -->
</this-page>
</whole-page>
</div>
Simple usage is to create a template which inherits from
/page.mako
and defines a page_content()
block, e.g.:
<%inherit file="/page.mako" />
<%def name="page_content()">
<p>hello world!</p>
</%def>
The default /page.mako
logic knows where to render the
page_content()
block so that it fits properly into the
component/layout structure.
Often you may need to customize Vue component logic for a page; this is done by defining one of the blocks mentioned in previous section.
Here is a simple example which shows how this works:
<%inherit file="/page.mako" />
<%def name="page_content()">
<b-field label="Foo">
<b-input v-model="foo" />
</b-field>
<b-field>
<b-button @click="alertFoo()">
Alert
</b-button>
</b-field>
</%def>
<%def name="modify_vue_vars()">
${parent.modify_vue_vars()}
<script>
// nb. this becomes ThisPage.data.foo
ThisPageData.foo = 'bar'
ThisPage.methods.alertFoo = function() {
alert("value of foo is: " + this.foo)
}
</script>
</%def>
You can see that page_content()
is able to reference things from
ThisPage
component, while the modify_vue_vars()
block is used
to define those same things on the component.
Form Base¶
The common base template for pages with a form, designated as:
/form.mako
This expects the context dict to contain 'form'
which points to a
Form
instance.
This template extends the Vue logic from /page.mako
by
establishing a Vue component specific to the form object.
The final structure then is conceptually like:
<div id="app">
<whole-page>
<!-- menu etc. -->
<this-page>
<wutta-form>
<!-- fields etc. -->
</wutta-form>
</this-page>
</whole-page>
</div>
A simple example which assumes one of the form fields exposes a button
with click event that triggers alertFoo()
method on the form
component:
<%inherit file="/form.mako" />
<%def name="modify_vue_vars()">
${parent.modify_vue_vars()}
<script>
// nb. this becomes e.g. WuttaForm.foo when component is created
${form.vue_component}Data.foo = 'bar'
${form.vue_component}.methods.alertFoo = function() {
alert("value of foo is: " + this.foo)
}
</script>
</%def>
Note
By default, ${form.vue_compoment}
is rendered as WuttaForm
but that is not guaranteed. You should resist the temptation to
hard-code that; always use ${form.vue_component}
and (where
applicable) ${form.vue_tagname}
.
The reason for this is to allow multiple forms to exist on a single page, each with a separate Vue component. (Which is not shown in the above example.)
See also vue_component
and
vue_tagname
.
Master Base¶
These templates are for use with
MasterView
. Each is the default
template used for the corresponding route/view, unless a more specific
template is defined.
The “index” template is unique in that it is (usually) for listing the model data:
/master/index.mako
The “form” template is just a base template, does not directly
correspond to a route/view. Other CRUD templates inherit from it.
This inherits from /form.mako
(see previous section).
/master/form.mako
These CRUD templates inherit from /master/form.mako
and so
require a 'form'
in the context dict.
/master/create.mako
/master/view.mako
/master/edit.mako
/master/delete.mako
The “configure” template is for master views which have a configuration page.
/master/configure.mako
Usage for these is not significantly different from the ones shown above, in cases where you actually need to override the template.
As an example let’s say you have defined a WidgetMasterView
class
and want to override its “view” template. You would then create a
file as /widgets/view.mako
(within your templates folder) and
be sure to inherit from the correct base template:
<%inherit file="/master/view.mako" />
<%def name="page_content()">
<p>THIS APPEARS FIRST!</p>
## nb. the form will appear here
${parent.page_content()}
<p>MADE IT TO THE END!</p>
</%def>