Jon,
> If you use this successfully to build custom form(s) can you post a
> sample of your controller and view here?
Model:
proof=SQLDB("sqlite://proof.db")
proof.define_table('match',
SQLField('name'),
SQLField('min', 'integer'),
SQLField('intent'),
SQLField('keep_black', 'boolean'))
proof.define_table('color',
SQLField('name'),
SQLField('match', proof.match),
SQLField('extra')
SQLField('c', 'integer', default=0),
SQLField('m', 'integer', default=0),
SQLField('y', 'integer', default=0),
SQLField('k', 'integer', default=0),
SQLField('publish', 'boolean')
SQLField('preview'))
proof.color.name.requires=IS_NOT_EMPTY()
proof.color.match.requires=IS_IN_DB(proof, "
match.id", "%(name)s",
orderby=proof.match.pos)
proof.color.extra.requires=IS_IN_SET(("Custom", "Option 2", "Option
3"))
proof.color.c.requires=IS_INT_IN_RANGE(0,101)
proof.color.m.requires=IS_INT_IN_RANGE(0,101)
proof.color.y.requires=IS_INT_IN_RANGE(0,101)
proof.color.k.requires=IS_INT_IN_RANGE(0,101)
Controller:
def update():
try:
rid = int(request.args[0])
record = proof(
proof.color.id==rid).select()[0]
except:
session.flash=T('Entry doesn't exists!')
redirect(URL(r=request,f='index'))
form=SQLFORM(proof.color, record, deletable=True)
if form.accepts(request.vars,session):
redirect(URL(r=request, f='index'))
return dict(form=form)
You see nothing special so long ;-)
view:
<form action="" enctype="multipart/form-data" method="post">
<fieldset>
<legend>Generic</legend>
<ol>
<li><label for="color_name">Name:</label>{{=form.element
(_name="name")}}</li>
<li><label for="my_fancy_id">Color-Match:</label>{{=form.element
(_name="match").update(_id="my_fancy_id")}}</li>
<li><label for="color_extra">Name:</label>{{=form.element
(_name="extra")}}</li>
</ol>
</fieldset>
<fieldset>
<legend>Color values</legend>
<ol>
{{for elm in "cmyk":}}
<li><label for="color_{{=elm}}"><span id="c_{{=elm}}">
{{=elm.capitalize()}}:</span></label>{{=form.element(_name=elm)}}</li>
<!-- or write this better with helpers
{{=LI(LABEL(SPAN(elm.capitalize()+":", _id="c_"+elm),
_for="color_"+elm), form.element(_name=elm))}}
-->
{{pass}}
</ol>
</fieldset>
<fieldset>
<label for=color_publish>publish</label>{{=form.element
(_name="publish")}}
<label for="delete_record">Delete this color</label>{{=form.element
(_id="delete_record")}}
<input type="submit" value="save">
{{=form.element(_name="reference").update(_type="hidden")}}
{{=form.element(_name="id")}}{{=form.hidden_fields()}}
</fieldset>
</form>
returns:
<form action="" enctype="multipart/form-data" method="post">
<fieldset>
<legend>Generic</legend>
<ol>
<li><label for="color_name">Name:</label><input class="string"
id="color_name" name="name" type="text" value="Cyan" /></li>
<li><label for="my_fancy_id">Color-Match:</label><select
class="reference match" id="my_fancy_id" name="match"><option
selected="selected" value="1">Match 1</option><option value="2">Match
2</option></select></li>
<li><label for="color_extra">Name:</label><select class="string"
id="color_extra" name="extra"><option value="Custom">Custom</
option><option value="Option 2">Option 2</option><option value="Option
3">Option 3</option></select></li>
</ol>
</fieldset>
<fieldset>
<legend>Color values</legend>
<ol>
<li><label for="color_c"><span id="c_c">C:</span></label><input
class="integer" id="color_c" name="c" type="text" value="0" /></li>
<!-- or write this better with helpers
<li><label for="color_c"><span id="c_c">C:</span></label><input
class="integer" id="color_c" name="c" type="text" value="0" /></li>
-->
<li><label for="color_m"><span id="c_m">M:</span></label><input
class="integer" id="color_m" name="m" type="text" value="28" /></li>
<!-- or write this better with helpers
<li><label for="color_m"><span id="c_m">M:</span></label><input
class="integer" id="color_m" name="m" type="text" value="28" /></li>
-->
<li><label for="color_y"><span id="c_y">Y:</span></label><input
class="integer" id="color_y" name="y" type="text" value="100" /></li>
<!-- or write this better with helpers
<li><label for="color_y"><span id="c_y">Y:</span></label><input
class="integer" id="color_y" name="y" type="text" value="100" /></li>
-->
<li><label for="color_k"><span id="c_k">K:</span></label><input
class="integer" id="color_k" name="k" type="text" value="0" /></li>
<!-- or write this better with helpers
<li><label for="color_k"><span id="c_k">K:</span></label><input
class="integer" id="color_k" name="k" type="text" value="0" /></li>
-->
</ol>
</fieldset>
<fieldset>
<label for=color_publish>publish</label><input class="boolean"
id="color_publish" name="publish" type="checkbox" value="on" />
<label for="delete_record">Delete this color</label><input
class="delete" id="delete_record" name="delete_this_record"
type="checkbox" value="on" />
<input type="submit" value="save">
<input class="reference reference" id="color_reference"
name="reference" type="hidden" value="5" />
<input name="id" type="hidden" value="4" /><input name="_formkey"
type="hidden" value="815a1592-f25e-4a25-af72-78ebedced385" /><input
name="_formname" type="hidden" value="color" />
</fieldset>
</form>
I hope you get an idea.
The benefits:
- only once define requires for appadmin and your custom forms in the
model
- handling of field values and errors is done from SQLFORM()
- No need to adjust class or id in controller
Martin