Pyjoyment.Plugin.TagHelpers - Tag helpers plugin¶
# Pyjoyment
app.plugin('TagHelpers')
# Pyjoyment.Lite
plugin('TagHelpers')
Pyjoyment.Plugin.TagHelpers is a collection of HTML tag helpers for
Pyjoyment, based on the
HTML Living Standard.
Most form helpers can automatically pick up previous input values and will
show them as default. You can also use the helper param of
Pyjoyment.Plugin.DefaultHelpers to set them manually and let necessary
attributes always be generated automatically.
% if not param('country'):
% param('country', 'germany')
% end
<%= radio_button('country', 'germany') %> Germany
<%= radio_button('country', 'france') %> France
<%= radio_button('country', 'uk') %> UK
For fields that failed validation with the helper validation of
Pyjoyment.Plugin.DefaultHelpers the field-with-error class will be
automatically added through tag_with_error, to make styling with CSS
easier.
<input class="field-with-error" name="age" type="text" value="250">
The helpers take the attributes of the tag as keyword arguments. An attribute
whose name is not an identifier of Python, or is a keyword of it, as
class, for or data-id, is passed with **, and an attribute
without a value has the value None.
%= text_field('first_name', **{'class': 'user'}, required=None)
A block of a template, between begin and end, is the content of the tag
when it is the last positional argument, and the attributes follow it.
%= label_for('first_name', begin
First name
%= end, **{'class': 'user'})
This is a core plugin, that means it is always enabled and its code a good example for learning how to build new plugins, you’re welcome to fork it.
See Pyjoyment.Plugins for a list of plugins that are available by
default.
Helpers¶
Pyjoyment.Plugin.TagHelpers implements the following helpers.
asset_tag
%= asset_tag('/app.js')
%= asset_tag('/app.js', **{'async': 'async'})
Generate script, link or img tag for static asset.
button_to
%= button_to('Test', 'some_get_route')
%= button_to('Test', 'some_get_route', {'id': 23}, **{'class': 'menu'})
%= button_to('Test', 'http://example.com/test', **{'class': 'menu'})
%= button_to('Remove', 'some_delete_route')
Generate portable form tag with form_for, containing a single button.
<form action="/path/to/get/route">
<input type="submit" value="Test">
</form>
<form action="/path/to/get/route/23" class="menu">
<input type="submit" value="Test">
</form>
<form action="http://example.com/test" class="menu">
<input type="submit" value="Test">
</form>
<form action="/path/to/delete/route?_method=DELETE" method="POST">
<input type="submit" value="Remove">
</form>
check_box
%= check_box('employed')
%= check_box('employed', 1)
%= check_box('employed', 1, checked=None, id='foo')
Generate input tag of type checkbox. Previous input values will
automatically get picked up and shown as default.
<input name="employed" type="checkbox">
<input name="employed" type="checkbox" value="1">
<input checked id="foo" name="employed" type="checkbox" value="1">
color_field
%= color_field('background')
%= color_field('background', '#ffffff')
%= color_field('background', '#ffffff', id='foo')
Generate input tag of type color. Previous input values will
automatically get picked up and shown as default.
<input name="background" type="color">
<input name="background" type="color" value="#ffffff">
<input id="foo" name="background" type="color" value="#ffffff">
csrf_button_to
%= csrf_button_to('Remove', 'some_delete_route')
Same as button_to, but also includes a csrf_field.
<form action="/path/to/delete/route?_method=DELETE" method="POST">
<input name="csrf_token" type="hidden" value="fa6a08...">
<input type="submit" value="Remove">
</form>
csrf_field
%= csrf_field()
Generate input tag of type hidden with the helper csrf_token of
Pyjoyment.Plugin.DefaultHelpers.
<input name="csrf_token" type="hidden" value="fa6a08...">
date_field
%= date_field('end')
%= date_field('end', '2012-12-21')
%= date_field('end', '2012-12-21', id='foo')
Generate input tag of type date. Previous input values will
automatically get picked up and shown as default.
<input name="end" type="date">
<input name="end" type="date" value="2012-12-21">
<input id="foo" name="end" type="date" value="2012-12-21">
datetime_field
%= datetime_field('end')
%= datetime_field('end', '2012-12-21T23:59:59')
%= datetime_field('end', '2012-12-21T23:59:59', id='foo')
Generate input tag of type datetime-local. Previous input values will
automatically get picked up and shown as default.
<input name="end" type="datetime-local">
<input name="end" type="datetime-local" value="2012-12-21T23:59:59">
<input id="foo" name="end" type="datetime-local" value="2012-12-21T23:59:59">
email_field
%= email_field('notify')
%= email_field('notify', 'nospam@example.com')
%= email_field('notify', 'nospam@example.com', id='foo')
Generate input tag of type email. Previous input values will
automatically get picked up and shown as default.
<input name="notify" type="email">
<input name="notify" type="email" value="nospam@example.com">
<input id="foo" name="notify" type="email" value="nospam@example.com">
favicon
%= favicon()
%= favicon('/favicon.ico')
Generate link tag for favicon, defaulting to the one that comes bundled
with Pyjoyment.
<link href="/favicon.ico" rel="icon">
<link href="/favicon.ico" rel="icon">
file_field
%= file_field('avatar')
%= file_field('avatar', id='foo')
Generate input tag of type file.
<input name="avatar" type="file">
<input id="foo" name="avatar" type="file">
form_for
%= form_for('login', begin
%= text_field('first_name')
%= submit_button()
%= end)
%= form_for('login', {'format': 'txt'}, begin
%= text_field('first_name')
%= submit_button()
%= end, method='POST')
%= form_for('/login', begin
%= text_field('first_name', disabled='disabled')
%= submit_button()
%= end, enctype='multipart/form-data')
%= form_for('http://example.com/login', begin
%= text_field('first_name')
%= submit_button()
%= end, method='POST')
%= form_for('some_delete_route', begin
%= submit_button('Remove')
%= end)
Generate portable form tag with
Pyjoyment.Controller.Pyjoyment_Controller.url_for(). For routes that do
not allow GET, a method attribute with the value POST will be
automatically added. And for methods other than GET or POST, an
_method query parameter will be added as well.
<form action="/path/to/login">
<input name="first_name" type="text">
<input type="submit" value="Ok">
</form>
<form action="/path/to/login.txt" method="POST">
<input name="first_name" type="text">
<input type="submit" value="Ok">
</form>
<form action="/path/to/login" enctype="multipart/form-data">
<input disabled="disabled" name="first_name" type="text">
<input type="submit" value="Ok">
</form>
<form action="http://example.com/login" method="POST">
<input name="first_name" type="text">
<input type="submit" value="Ok">
</form>
<form action="/path/to/delete/route?_method=DELETE" method="POST">
<input type="submit" value="Remove">
</form>
hidden_field
%= hidden_field('foo', 'bar')
%= hidden_field('foo', 'bar', id='bar')
Generate input tag of type hidden.
<input name="foo" type="hidden" value="bar">
<input id="bar" name="foo" type="hidden" value="bar">
image
%= image('/images/foo.png')
%= image('/images/foo.png', alt='Foo')
Generate portable img tag.
<img src="/path/to/images/foo.png">
<img alt="Foo" src="/path/to/images/foo.png">
input_tag
%= input_tag('first_name')
%= input_tag('first_name', 'Default')
%= input_tag('employed', type='checkbox')
Generate input tag. Previous input values will automatically get picked up
and shown as default.
<input name="first_name">
<input name="first_name" value="Default">
<input name="employed" type="checkbox">
javascript
%= javascript('/script.js')
%= javascript('/script.js', defer=None)
%= javascript(begin
const a = 'b';
%= end)
Generate portable script tag for JavaScript asset.
<script src="/path/to/script.js"></script>
<script defer src="/path/to/script.js"></script>
<script>//<![CDATA[
const a = 'b';
//]]></script>
label_for
%= label_for('first_name', 'First name')
%= label_for('first_name', 'First name', **{'class': 'user'})
%= label_for('first_name', begin
First name
%= end)
%= label_for('first_name', begin
First name
%= end, **{'class': 'user'})
Generate label tag.
<label for="first_name">First name</label>
<label class="user" for="first_name">First name</label>
<label for="first_name">
First name
</label>
<label class="user" for="first_name">
First name
</label>
link_to
%= link_to('Home', 'index')
%= link_to('Home', 'index', {'format': 'txt'}, **{'class': 'menu'})
%= link_to('index', {'format': 'txt'}, begin
Home
%= end, **{'class': 'menu'})
%= link_to('Contact', 'mailto:sri@example.com')
<%= link_to('index', begin %>Home<% end) %>
<%= link_to('/file.txt', begin %>File<% end) %>
<%= link_to('https://mojolicious.org', begin %>Mojolicious<% end) %>
<%= link_to(url_for().set(query={'foo': 'bar'}).to_abs(), begin %>Retry<% end) %>
Generate portable a tag with
Pyjoyment.Controller.Pyjoyment_Controller.url_for(), defaults to using
the capitalized link target as content.
<a href="/path/to/index">Home</a>
<a class="menu" href="/path/to/index.txt">Home</a>
<a class="menu" href="/path/to/index.txt">
Home
</a>
<a href="mailto:sri@example.com">Contact</a>
<a href="/path/to/index">Home</a>
<a href="/path/to/file.txt">File</a>
<a href="https://mojolicious.org">Mojolicious</a>
<a href="http://127.0.0.1:3000/current/path?foo=bar">Retry</a>
The first argument to link_to is the link content, except when the last
positional argument is a callable, such as a template block (created with the
begin and end keywords); in that case, the link content is omitted at
the start of the argument list, and the block will become the link content.
month_field
%= month_field('vacation')
%= month_field('vacation', '2012-12')
%= month_field('vacation', '2012-12', id='foo')
Generate input tag of type month. Previous input values will
automatically get picked up and shown as default.
<input name="vacation" type="month">
<input name="vacation" type="month" value="2012-12">
<input id="foo" name="vacation" type="month" value="2012-12">
number_field
%= number_field('age')
%= number_field('age', 25)
%= number_field('age', 25, id='foo', min=0, max=200)
Generate input tag of type number. Previous input values will
automatically get picked up and shown as default.
<input name="age" type="number">
<input name="age" type="number" value="25">
<input id="foo" max="200" min="0" name="age" type="number" value="25">
password_field
%= password_field('pass')
%= password_field('pass', id='foo')
Generate input tag of type password.
<input name="pass" type="password">
<input id="foo" name="pass" type="password">
radio_button
%= radio_button('test')
%= radio_button('country', 'germany')
%= radio_button('country', 'germany', checked=None, id='foo')
Generate input tag of type radio. Previous input values will
automatically get picked up and shown as default.
<input name="test" type="radio">
<input name="country" type="radio" value="germany">
<input checked id="foo" name="country" type="radio" value="germany">
range_field
%= range_field('age')
%= range_field('age', 25)
%= range_field('age', 25, id='foo', min=0, max=200)
Generate input tag of type range. Previous input values will
automatically get picked up and shown as default.
<input name="age" type="range">
<input name="age" type="range" value="25">
<input id="foo" max="200" min="0" name="age" type="range" value="25">
search_field
%= search_field('q')
%= search_field('q', 'perl')
%= search_field('q', 'perl', id='foo')
Generate input tag of type search. Previous input values will
automatically get picked up and shown as default.
<input name="q" type="search">
<input name="q" type="search" value="perl">
<input id="foo" name="q" type="search" value="perl">
select_field
%= select_field('country', ['de', 'en'])
%= select_field('country', [['Germany', 'de'], 'en'], id='eu')
%= select_field('country', [['Germany', 'de', {'selected': 'selected'}], 'en'])
%= select_field('country', [c.c('EU', [['Germany', 'de'], 'en'], {'id': 'eu'})])
%= select_field('country', [c.c('EU', ['de', 'en']), c.c('Asia', ['cn', 'jp'])])
Generate select and option tags from lists and optgroup tags from
Pyjo.Collection objects. An option is its value or a list of its label,
its value and a dict of its attributes; a group is a collection of its label,
its options and a dict of its attributes. Previous input values will
automatically get picked up and shown as default.
<select name="country">
<option value="de">de</option>
<option value="en">en</option>
</select>
<select id="eu" name="country">
<option value="de">Germany</option>
<option value="en">en</option>
</select>
<select name="country">
<option selected="selected" value="de">Germany</option>
<option value="en">en</option>
</select>
<select name="country">
<optgroup id="eu" label="EU">
<option value="de">Germany</option>
<option value="en">en</option>
</optgroup>
</select>
<select name="country">
<optgroup label="EU">
<option value="de">de</option>
<option value="en">en</option>
</optgroup>
<optgroup label="Asia">
<option value="cn">cn</option>
<option value="jp">jp</option>
</optgroup>
</select>
stylesheet
%= stylesheet('/foo.css')
%= stylesheet('/foo.css', title='Foo style')
%= stylesheet(begin
body {color: #000}
%= end)
Generate portable style or link tag for CSS asset.
<link href="/path/to/foo.css" rel="stylesheet">
<link href="/path/to/foo.css" rel="stylesheet" title="Foo style">
<style>/*<![CDATA[*/
body {color: #000}
/*]]>*/</style>
submit_button
%= submit_button()
%= submit_button('Ok!', id='foo')
Generate input tag of type submit.
<input type="submit" value="Ok">
<input id="foo" type="submit" value="Ok!">
t
%= t('div', 'test & 123')
Alias for tag.
<div>test & 123</div>
tag
%= tag('br')
%= tag('div')
%= tag('div', id='foo', hidden=None)
%= tag('div', 'test & 123')
%= tag('div', 'test & 123', id='foo')
%= tag('div', 'test & 123', data={'my_id': 1, 'Name': 'test'})
%= tag('div', begin
test & 123
%= end)
<%= tag('div', begin %>test & 123<% end, id='foo') %>
Alias for Pyjo.DOM.Pyjo_DOM.new_tag().
<br>
<div></div>
<div hidden id="foo"></div>
<div>test & 123</div>
<div id="foo">test & 123</div>
<div data-my-id="1" data-name="test">test & 123</div>
<div>
test & 123
</div>
<div id="foo">test & 123</div>
Very useful for reuse in more specific tag helpers.
output = c.tag('meta')
output = c.tag('meta', charset='UTF-8')
output = c.tag('div', '<p>This will be escaped</p>')
output = c.tag('div', lambda: '<p>This will not be escaped</p>')
Results are automatically wrapped in Pyjo.String.HTML objects to
prevent accidental double escaping in ep templates.
tag_with_error
%= tag_with_error('input', **{'class': 'foo'})
Same as tag, but adds the class field-with-error.
<input class="foo field-with-error">
tel_field
%= tel_field('work')
%= tel_field('work', '123456789')
%= tel_field('work', '123456789', id='foo')
Generate input tag of type tel. Previous input values will
automatically get picked up and shown as default.
<input name="work" type="tel">
<input name="work" type="tel" value="123456789">
<input id="foo" name="work" type="tel" value="123456789">
text_area
%= text_area('story')
%= text_area('story', cols=40)
%= text_area('story', 'Default', cols=40)
%= text_area('story', begin
Default
%= end, cols=40)
Generate textarea tag. Previous input values will automatically get picked
up and shown as default.
<textarea name="story"></textarea>
<textarea cols="40" name="story"></textarea>
<textarea cols="40" name="story">Default</textarea>
<textarea cols="40" name="story">
Default
</textarea>
text_field
%= text_field('first_name')
%= text_field('first_name', 'Default')
%= text_field('first_name', 'Default', **{'class': 'user'})
Generate input tag of type text. Previous input values will
automatically get picked up and shown as default.
<input name="first_name" type="text">
<input name="first_name" type="text" value="Default">
<input class="user" name="first_name" type="text" value="Default">
time_field
%= time_field('start')
%= time_field('start', '23:59:59')
%= time_field('start', '23:59:59', id='foo')
Generate input tag of type time. Previous input values will
automatically get picked up and shown as default.
<input name="start" type="time">
<input name="start" type="time" value="23:59:59">
<input id="foo" name="start" type="time" value="23:59:59">
url_field
%= url_field('address')
%= url_field('address', 'https://mojolicious.org')
%= url_field('address', 'https://mojolicious.org', id='foo')
Generate input tag of type url. Previous input values will
automatically get picked up and shown as default.
<input name="address" type="url">
<input name="address" type="url" value="https://mojolicious.org">
<input id="foo" name="address" type="url" value="https://mojolicious.org">
week_field
%= week_field('vacation')
%= week_field('vacation', '2012-W17')
%= week_field('vacation', '2012-W17', id='foo')
Generate input tag of type week. Previous input values will
automatically get picked up and shown as default.
<input name="vacation" type="week">
<input name="vacation" type="week" value="2012-W17">
<input id="foo" name="vacation" type="week" value="2012-W17">
See also¶
Pyjoyment, https://mojolicious.org.
Ported from Mojolicious::Plugin::TagHelpers of Mojolicious 9.49.
- class Pyjoyment.Plugin.TagHelpers.Helpers[source]¶
The types of the helpers of
Pyjoyment.Plugin.TagHelpers, for type checkers and editors, whichPyjoyment.ControllerandPyjoymenthave, while the helpers themselves are found in the renderer of the application at run time. SeePyjoyment.Controller.Helper.
- class Pyjoyment.Plugin.TagHelpers.Pyjoyment_Plugin_TagHelpers[source]¶
Pyjoyment.Plugin.TagHelpersinherits all methods fromPyjoyment.Pluginand implements the following new ones.- register(app: Pyjoyment_App, conf: dict[str, Any] | None = None) None[source]¶
plugin.register(Pyjoyment.new())
Register helpers in
Pyjoymentapplication.