"""
Form Tag Helpers
"""
# Last synced with Rails copy at Revision 4374 on Aug 19th, 2006.
from urls import confirm_javascript_function
from tags import *
from webhelpers.util import html_escape
def form(url, method="post", multipart=False, **options):
"""
Starts a form tag that points the action to an url.
The url options should be given either as a string, or as a ``url()``
function. The method for the form defaults to POST.
Options:
``multipart``
If set to True, the enctype is set to "multipart/form-data".
``method``
The method to use when submitting the form, usually either "get" or
"post". If "put", "delete", or another verb is used, a hidden input
with name _method is added to simulate the verb over post.
"""
if multipart:
options["enctype"] = "multipart/form-data"
if callable(url):
url = url()
else:
url = html_escape(url)
method_tag = ""
if method in ['post', 'get']:
options['method'] = method
else:
options['method'] = "post"
method_tag = tag('input', type="hidden", name_="_method", value=method)
options["action"] = url
return tag("form", True, **options) + method_tag
start_form = form
def end_form():
"""
Outputs ""
"""
return ""
def select(name, option_tags='', **options):
"""
Creates a dropdown selection box
``option_tags`` is a string containing the option tags for the select box::
>>> select("people", "")
Options:
* ``multiple`` - If set to true the selection will allow multiple choices.
"""
o = { 'name_': name, 'id': name }
o.update(options)
return content_tag("select", option_tags, **o)
def text_field(name, value=None, **options):
"""
Creates a standard text field.
``value`` is a string that will the contents of the text field will be set to
Options:
* ``disabled`` - If set to True, the user will not be able to use this input.
* ``size`` - The number of visible characters that will fit in the input.
* ``maxlength`` - The maximum number of characters that the browser will allow the user to enter.
Remaining keyword options will be standard HTML options for the tag.
"""
o = {'type': 'text', 'name_': name, 'id': name, 'value': value}
o.update(options)
return tag("input", **o)
def hidden_field(name, value=None, **options):
"""
Creates a hidden field.
Takes the same options as text_field
"""
return text_field(name, value, type="hidden", **options)
def file_field(name, value=None, **options):
"""
Creates a file upload field.
If you are using file uploads then you will also need to set the multipart option for the form.
"""
return text_field(name, value=value, type="file", **options)
def password_field(name="password", value=None, **options):
"""
Creates a password field
Takes the same options as text_field
"""
return text_field(name, value, type="password", **options)
def text_area(name, content='', **options):
"""
Creates a text input area.
Options:
* ``size`` - A string specifying the dimensions of the textarea.
Example::
>>> text_area("body", '', size="25x10")
"""
if 'size' in options:
options["cols"], options["rows"] = options["size"].split("x")
del options['size']
o = {'name_': name, 'id': name}
o.update(options)
return content_tag("textarea", content, **o)
def check_box(name, value="1", checked=False, **options):
"""
Creates a check box.
"""
o = {'type': 'checkbox', 'name_': name, 'id': name, 'value': value}
o.update(options)
if checked:
o["checked"] = "checked"
return tag("input", **o)
def radio_button(name, value, checked=False, **options):
"""Creates a radio button."""
o = {'type': 'radio', 'name_': name, 'id': name, 'value': value}
o.update(options)
if checked:
o["checked"] = "checked"
return tag("input", **o)
def submit(value="Save changes", name='commit', confirm=None, disable_with=None, **options):
"""Creates a submit button with the text ``value`` as the caption.
Options:
* ``confirm`` - A confirm message displayed when the button is clicked.
* ``disable_with`` - The value to be used to rename a disabled version of the submit
button.
"""
if confirm:
onclick = options.get('onclick', '')
if onclick.strip() and not onclick.rstrip().endswith(';'):
onclick += ';'
options['onclick'] = "%s return %s;" % (onclick, confirm_javascript_function(confirm))
if disable_with:
options["onclick"] = "this.disabled=true;this.value='%s';this.form.submit();%s" % (disable_with, options.get("onclick", ''))
o = {'type': 'submit', 'name_': name, 'value': value }
o.update(options)
return tag("input", **o)
#def image_submit(source, **options):
# """Displays an image which when clicked will submit the form"""
# o = {'type': 'image', 'src': image_path_source) }
# o.update(options)
# return tag("input", **o)
__all__ = ['form', 'start_form', 'end_form', 'select', 'text_field', 'hidden_field', 'file_field',
'password_field', 'text_area', 'check_box', 'radio_button', 'submit']