Return to Snippet

Revision: 9974
at December 1, 2008 22:46 by wackysalut


Updated Code
######################################################## development.ini / production.ini

[app:main]
...
lang = fr

##################################################################### project/lib/base.py

class BaseController(WSGIController):

    ### [...snip...]

    def __before__(self):

        ### [...snip...]

        formencode.api.set_stdtranslation(domain="FormEncode",
                                          languages=[config.get('lang', 'fr')])

################################################################## project/lib/helpers.py

from formencode import htmlfill
def p_error_formatter(error):  
    return '<p class="error">%s</p>' % htmlfill.html_quote(error) 

def ol_error_formatter(error):  
    return '<ol class="errors"><li>%s</li></ol>' % htmlfill.html_quote(error) 

def div_error_formatter(error):  
    return '<div class="error">%s</div>' % htmlfill.html_quote(error) 

def errorform(form_content, errors):
    """Return an HTMLFILLed form, according to those errors"""
    formats = {'default': p_error_formatter,
               'p': p_error_formatter,
               'ol': ol_error_formatter,
               'div': div_error_formatter}
    
    defs = errors.value if errors else {}
    errs = errors.unpack_errors() if errors else {}

    return htmlfill.render(form_content, defs, errs,
                           add_attributes={'+class': ' error'},
                           error_formatters=formats)

#
# NOTE: this will add a "class='error'" to each <input /> tag also.
##

############################################################# project/contorller/prefs.py
import formencode
from formencode import validators
from formencode import htmlfill

class UniqueUsername(formencode.FancyValidator):
    def _to_python(self, value, state):
        chk = model.User.query.filter_by(username=value).first()
        if chk:
            raise formencode.Invalid(
                "Ce nom d'usager existe déjà",
                value, state)
        return value


class PasswdValidate(formencode.Schema):
    username = formencode.All(validators.String(min=6,max=20),
                              validators.PlainText(),
                              UniqueUsername())
    passwd1 = validators.String(not_empty=True)
    passwd2 = validators.String(not_empty=True)

    chained_validators = [validators.FieldsMatch('passwd1', 'passwd2')]


### CONTROLLER

class PrefsController(BaseController):
    def passwd(self):

        return render("/prefs/passwd.html")

    def save_passwd(self):

        try:
            prm = PasswdValidate().to_python(request.params)
        except validators.Invalid, e:
            c.errors = e
            return render('/prefs/passwd.html')


##################################### project/templates/prefs/passwd.html (Mako template)
##
## NOTE tue usage of: buffered="True" .. required for h.errorform() to get the content
##
${h.errorform(form(), c.errors)}
<%def name="form()" buffered="True">
<form id="editform" action="${h.url_for(action='save_passwd')}" method="post">

  <ol>
    <li class="first"><label for="username">Username<em>*</em></label>
        ${h.text_field('username', size=15)}<br />
        <form:error name="username" format="ol" />
    </li>

    <li><label>Password:</label>
        <input type="password" name="passwd1" size="15" />
        <form:error name="passwd1" />
    </li>

    <li class="first"><label>Punch it again:</label>
        <input type="password" name="passwd2" size="15" />
        <form:error name="passwd2" />
    </li>
  </ol>
  <br />

  <input type="submit" value="Save" />

</form>
</%def>

################################################################# Add your own stylesheet

/* with stuff :) */

Revision: 9973
at December 1, 2008 22:27 by wackysalut


Updated Code
######################################################## development.ini / production.ini

[app:main]
...
lang = fr

##################################################################### project/lib/base.py

class BaseController(WSGIController):

    ### [...snip...]

    def __before__(self):

        ### [...snip...]

        formencode.api.set_stdtranslation(domain="FormEncode",
                                          languages=[config.get('lang', 'fr')])

################################################################## project/lib/helpers.py

from formencode import htmlfill

def errorform(form_content, errors):
    """Return an HTMLFILLed form, according to those errors"""
    defs = errors.value if errors else {}
    errs = errors.unpack_errors() if errors else {}

    return htmlfill.render(form_content, defs, errs,
                           add_attributes={'+class': ' error'})

#
# NOTE: this will add a "class='error'" to each <input /> tag also.
##

############################################################# project/contorller/prefs.py
import formencode
from formencode import validators
from formencode import htmlfill

class UniqueUsername(formencode.FancyValidator):
    def _to_python(self, value, state):
        chk = model.User.query.filter_by(username=value).first()
        if chk:
            raise formencode.Invalid(
                'That username already exists',
                value, state)
        return value


class PasswdValidate(formencode.Schema):
    username = formencode.All(validators.String(min=6,max=20),
                              validators.PlainText(),
                              UniqueUsername())
    passwd1 = validators.String(not_empty=True)
    passwd2 = validators.String(not_empty=True)

    chained_validators = [validators.FieldsMatch('passwd1', 'passwd2')]


### CONTROLLER

class PrefsController(BaseController):
    def passwd(self):

        return render("/prefs/passwd.html")

    def save_passwd(self):

        try:
            prm = PasswdValidate().to_python(request.params)
        except validators.Invalid, e:
            c.errors = e
            return render('/prefs/passwd.html')


##################################### project/templates/prefs/passwd.html (Mako template)
##
## NOTE tue usage of: buffered="True" .. required for h.errorform() to get the content
##
${h.errorform(form(), c.errors)}
<%def name="form()" buffered="True">
<form id="editform" action="${h.url_for(action='save_passwd')}" method="post">

  <ol>
    <li class="first"><label for="username">Username<em>*</em></label>
        ${h.text_field('username', size=15)}<br />
        <form:error name="username" />
    </li>

    <li><label>Password:</label>
        <input type="password" name="passwd1" size="15" />
        <form:error name="passwd1" />
    </li>

    <li class="first"><label>Punch it again:</label>
        <input type="password" name="passwd2" size="15" />
        <form:error name="passwd2" />
    </li>
  </ol>
  <br />

  <input type="submit" value="Save" />

</form>
</%def>

Revision: 9972
at December 1, 2008 22:23 by wackysalut


Updated Code
##################################################################### project/lib/base.py

class BaseController(WSGIController):

    ### [...snip...]

    def __before__(self):

        ### [...snip...]

        formencode.api.set_stdtranslation(domain="FormEncode", languages=["fr"])


################################################################## project/lib/helpers.py

from formencode import htmlfill

def errorform(form_content, errors):
    """Return an HTMLFILLed form, according to those errors"""
    defs = errors.value if errors else {}
    errs = errors.unpack_errors() if errors else {}

    return htmlfill.render(form_content, defs, errs,
                           add_attributes={'+class': ' error'})

#
# NOTE: this will add a "class='error'" to each <input /> tag also.
##

############################################################# project/contorller/prefs.py
import formencode
from formencode import validators
from formencode import htmlfill

class UniqueUsername(formencode.FancyValidator):
    def _to_python(self, value, state):
        chk = model.User.query.filter_by(username=value).first()
        if chk:
            raise formencode.Invalid(
                'That username already exists',
                value, state)
        return value


class PasswdValidate(formencode.Schema):
    username = formencode.All(validators.String(min=6,max=20),
                              validators.PlainText(),
                              UniqueUsername())
    passwd1 = validators.String(not_empty=True)
    passwd2 = validators.String(not_empty=True)

    chained_validators = [validators.FieldsMatch('passwd1', 'passwd2')]


### CONTROLLER

class PrefsController(BaseController):
    def passwd(self):

        return render("/prefs/passwd.html")

    def save_passwd(self):

        try:
            prm = PasswdValidate().to_python(request.params)
        except validators.Invalid, e:
            c.errors = e
            return render('/prefs/passwd.html')


##################################### project/templates/prefs/passwd.html (Mako template)
##
## NOTE tue usage of: buffered="True" .. required for h.errorform() to get the content
##
${h.errorform(form(), c.errors)}
<%def name="form()" buffered="True">
<form id="editform" action="${h.url_for(action='save_passwd')}" method="post">

  <ol>
    <li class="first"><label for="username">Username<em>*</em></label>
        ${h.text_field('username', size=15)}<br />
        <form:error name="username" />
    </li>

    <li><label>Password:</label>
        <input type="password" name="passwd1" size="15" />
        <form:error name="passwd1" />
    </li>

    <li class="first"><label>Punch it again:</label>
        <input type="password" name="passwd2" size="15" />
        <form:error name="passwd2" />
    </li>
  </ol>
  <br />

  <input type="submit" value="Save" />

</form>
</%def>

Revision: 9971
at December 1, 2008 22:21 by wackysalut


Initial Code
################################################################## project/lib/helpers.py

from formencode import htmlfill

def errorform(form_content, errors):
    """Return an HTMLFILLed form, according to those errors"""
    defs = errors.value if errors else {}
    errs = errors.unpack_errors() if errors else {}

    return htmlfill.render(form_content, defs, errs,
                           add_attributes={'+class': ' error'})

#
# NOTE: this will add a "class='error'" to each <input /> tag also.
##

############################################################# project/contorller/prefs.py
import formencode
from formencode import validators
from formencode import htmlfill

class UniqueUsername(formencode.FancyValidator):
    def _to_python(self, value, state):
        chk = model.User.query.filter_by(username=value).first()
        if chk:
            raise formencode.Invalid(
                'That username already exists',
                value, state)
        return value


class PasswdValidate(formencode.Schema):
    username = formencode.All(validators.String(min=6,max=20),
                              validators.PlainText(),
                              UniqueUsername())
    passwd1 = validators.String(not_empty=True)
    passwd2 = validators.String(not_empty=True)

    chained_validators = [validators.FieldsMatch('passwd1', 'passwd2')]


### CONTROLLER

class PrefsController(BaseController):
    def passwd(self):

        return render("/prefs/passwd.html")

    def save_passwd(self):

        try:
            prm = PasswdValidate().to_python(request.params)
        except validators.Invalid, e:
            c.errors = e
            return render('/prefs/passwd.html')


##################################### project/templates/prefs/passwd.html (Mako template)
##
## NOTE tue usage of: buffered="True" .. required for h.errorform() to get the content
##
${h.errorform(form(), c.errors)}
<%def name="form()" buffered="True">
<form id="editform" action="${h.url_for(action='save_passwd')}" method="post">

  <ol>
    <li class="first"><label for="username">Username<em>*</em></label>
        ${h.text_field('username', size=15)}<br />
        <form:error name="username" />
    </li>

    <li><label>Password:</label>
        <input type="password" name="passwd1" size="15" />
        <form:error name="passwd1" />
    </li>

    <li class="first"><label>Punch it again:</label>
        <input type="password" name="passwd2" size="15" />
        <form:error name="passwd2" />
    </li>
  </ol>
  <br />

  <input type="submit" value="Save" />

</form>
</%def>

Initial URL


Initial Description
These are code snippets from different files for a Pylons project that show a working (provided the environment) htmlfill example.

Initial Title
htmlfill and Pylons integration, form validation inside controller and Mako template example with i18n

Initial Tags
validation

Initial Language
Python