pyTenjin Examples
release: 0.9.0
last update: $Date$
last update: $Date$
Table of Contents:
Bordered Table
Template: 'table.pyhtml'
<html> <body> <h1>${title}</h1> <table> <?py i = 0 ?> <?py for item in items: ?> <?py i += 1 ?> <?py color = i % 2 == 0 and '#FFCCCC' or '#CCCCFF' ?> <tr bgcolor="#{color}"> <td>#{i}</td> <td>${item}</td> </tr> <?py #endfor ?> </table> </body> </html>
Convert into Python script:
$ pytenjin -a convert table.pyhtml _buf = []; _buf.extend(('''<html> <body> <h1>''', escape(to_str(title)), '''</h1> <table>\n''', )); i = 0 for item in items: i += 1 color = i % 2 == 0 and '#FFCCCC' or '#CCCCFF' _buf.extend((''' <tr bgcolor="''', to_str(color), '''"> <td>''', to_str(i), '''</td> <td>''', escape(to_str(item)), '''</td> </tr>\n''', )); #endfor _buf.extend((''' </table> </body> </html>\n''', )); print(''.join(_buf))
Main program: 'table.py'
## create Engine object import tenjin from tenjin.helpers import * engine = tenjin.Engine() ## render template with context data context = { 'title': 'Bordered Table Example', 'items': [ '<AAA>', 'B&B', '"CCC"' ] } output = engine.render('table.pyhtml', context) print output,
Result:
$ python table.py <html> <body> <h1>Bordered Table Example</h1> <table> <tr bgcolor="#CCCCFF"> <td>1</td> <td><AAA></td> </tr> <tr bgcolor="#FFCCCC"> <td>2</td> <td>B&B</td> </tr> <tr bgcolor="#CCCCFF"> <td>3</td> <td>"CCC"</td> </tr> </table> </body> </html>
Form
Template: 'form.pyhtml':
<?py #@ARGS action, params, label ?> <form action="${action}" method="post"> <p> <label>Name:</label> <input type="text" name="name" value="${params.get('name')}" /> </p> <p> <label>Gender:</label> <?py gender = params.get('gender') ?> <?py checked = {True:' checked="checked"', False:''} ?> <input type="radio" name="gender" value="M" #{checked[gender=='M']} />Man <input type="radio" name="gender" value="W" #{checked[gender=='W']} />Woman </p> <input type="submit" value="${label}" /> </form>
Template: 'create.pyhtml':
<?py _context['title'] = 'Create user' ?> <?py _context['label'] = 'Create' ?> <?py _context['action'] = 'action.cgi' ?> <?py include(':form') ?>
Template: 'update.pyhtml':
<?py _context['title'] = 'Update user' ?> <?py _context['label'] = 'Update' ?> <?py _context['action'] = 'update.cgi' ?> <?py include(':form') ?>
Layout template: 'layout.pyhtml'
<html> <body> <h1>${title}</h1> <div class="main-content"> #{_content} </div> </body> </html>
Main program: 'main.py':
## create Engine object import tenjin from tenjin.helpers import * engine = tenjin.Engine(postfix='.pyhtml', layout='layout.pyhtml') ## render template with context data params = { 'name': 'Foo', 'gender': 'M' } context = { 'params': params } output = engine.render(':update', context) # ':update' == 'update'+postfix print output,
Result:
$ python main.py <html> <body> <h1>Update user</h1> <div class="main-content"> <form action="update.cgi" method="post"> <p> <label>Name:</label> <input type="text" name="name" value="Foo" /> </p> <p> <label>Gender:</label> <input type="radio" name="gender" value="M" checked="checked" />Man <input type="radio" name="gender" value="W" />Woman </p> <input type="submit" value="Update" /> </form> </div> </body> </html>
Preprocessing
Library: 'helper.py'
languages = [ ('en', 'Engilish'), ('fr', 'French'), ('de', 'German'), ('es', 'Spanish'), ('ch', 'Chinese'), ('ja', 'Japanese'), ] import urllib def link_to(label, action=None, id=None): buf = ['/app'] if action: buf.append(action) if id: buf.append(id) return '<a href="%s">%s</a>' % (urllib.quote('/'.join(buf)), label)
Template: 'select.pyhtml'
<?PY import helper ?> <?PY from helper import * ?> <form> <label>Select your language:</label> <select name="lang"> <?py table = { params['lang']: ' selected="selected"' } ?> <?PY for val, name in languages: ?> <option value="${{val}}" #{table.get(#{{repr(val)}}, '')}>${{name}}</option> <?PY #endfor ?> </select> <input type="submit" value="OK" /> </form> <p> #{{link_to('Back', action='index')}} | #{{link_to('Show '+_P('params["name"]'), action='show', id=_p('params["id"]'))}} </p>
Preprocessed code:
$ pytenjin -a preprocess select.pyhtml <form> <label>Select your language:</label> <select name="lang"> <?py table = { params['lang']: ' selected="selected"' } ?> <option value="en" #{table.get('en', '')}>Engilish</option> <option value="fr" #{table.get('fr', '')}>French</option> <option value="de" #{table.get('de', '')}>German</option> <option value="es" #{table.get('es', '')}>Spanish</option> <option value="ch" #{table.get('ch', '')}>Chinese</option> <option value="ja" #{table.get('ja', '')}>Japanese</option> </select> <input type="submit" value="OK" /> </form> <p> <a href="/app/index">Back</a> | <a href="/app/show/#{params["id"]}">Show ${params["name"]}</a> </p>
Main program: 'main.py'
import helper ## create engine import tenjin from tenjin.helpers import * engine = tenjin.Engine(postfix='.pyhtml', preprocess=True) ## render template with context data params = { 'id': 1234, 'name': 'Foo', 'lang': 'ch' } context = { 'params': params } output = engine.render(':select', context); print output,
Result:
$ python main.py <form> <label>Select your language:</label> <select name="lang"> <option value="en" >Engilish</option> <option value="fr" >French</option> <option value="de" >German</option> <option value="es" >Spanish</option> <option value="ch" selected="selected">Chinese</option> <option value="ja" >Japanese</option> </select> <input type="submit" value="OK" /> </form> <p> <a href="/app/index">Back</a> | <a href="/app/show/1234">Show Foo</a> </p>