Customizing forms

71 views
Skip to first unread message

billf

unread,
Oct 8, 2008, 4:40:44 PM10/8/08
to web2py Web Framework
I am trying to get to grips with forms as part of an attempt to re-
engineer an existing Java webapp using web2py.

I like the ability to generate a form automatically. I especially
like the benefit that accepts() gives. However, I can foresee many
situations where the auto-generated form is not what I want in terms
of layout. I have looked a little at widgets but I don't think that
allows the ability to manage the overall form layout. I know that I
can use the HTML building objects but I don't want presentation logic
in the controller.

It seems to me (at the moment) that the ideal would be the ability,
when necessary, to design a form manually in a view using html/css but
be able to utilise the form.accepts() logic in the controller.

I'm tempted to think that this is already possible. If I code:

form=SQLFORM(db.recipe)
if form.accepts(request.vars,session):
whatever...

...I am assuming that this creates a form based on db.recipe and
populates the form.vars with request.vars and does the rest
(validation, updating db). I just need to ensure that the
request.vars names are those expected by the form?

Before I spend a lot of time on this am I heading up a dead-end?

Bill

Timothy Farrell

unread,
Oct 8, 2008, 4:55:40 PM10/8/08
to web...@googlegroups.com
Bill,

I crossed this bridge a few weeks ago. I, like you, don't dig the whole
presentation logic in the controller. However, it is still reasonable
to build a "form" in the controller for logical data-handling purposes.
Here's what I did:

# Build our form
form=FORM(INPUT(_type="text", _name="name"
, requires=IS_MATCH('[A-Za-z0-9-\.\']{4,40}'))
,SELECT(_name="county"
,requires=IS_IN_SET(COUNTIES) )
,INPUT(_type="checkbox", _name="td"
,requires=IS_NULL_OR(IS_MATCH('on')))
)
# If the submit validates, act accordingly
if form.accepts(request.vars, formname="polinfo"):
# process passed data here...

Once I made "form", I never passed it to the view, instead I used this form:

<form method="POST"
id="polinfo"
action="">
<div>
<label for="name">Name:</label>
<input type="text"
name="name"
id="name" />
</div>
<div>
<label for="county">County:</label>
<select name="county"
id="county">
<option></option>
<option value="Oklahoma">
Oklahoma
</option>
<option value="Other">
Other
</option>
<option value="Tulsa">
Tulsa
</option>
</select>
</div>
<div>
<label for="td">TD:</label>
<input type="checkbox"
id="TD"
name="td" />
<input type="hidden"
name="_formname" value="polinfo" />
</div>
</form>

Notice that I included a hidden field "_formname". This is the trick
that you need to get it to work.

There you go, a happy marriage of both the ease of web2py forms while
maintaining proper MVC separation.

-tim

tfarrell.vcf

Timothy Farrell

unread,
Oct 8, 2008, 5:12:12 PM10/8/08
to web...@googlegroups.com
I should also note that while this method has the advantage of using web2py's built-in data-verifiers, if you use FormEncode, you can get a bit more power and flexibility for about the same amount of code.  Verifying the form I posted with FormEncode would look like:

import formencode

class FormValidator(formencode.Schema):
    name = validators.Regex(r'[A-Za-z0-9-\.\']{4,40}')
    county =
validators.OneOf(COUNTIES)
    td = validators.Regex(r'on', if_missing='', if_empty='')

try:
    data =
FormValidator(allow_extra_fields = True).to_python(dict(request.vars))
    # Validation succeeded, continue
except formencode.Invalid, e:
    # Validation failed, see messages in e
    message = e.message

Bummer (for FormEncode) that form.accepts is so much cleaner than the FormEncode version.   Maybe I'll wrap it into a nice pretty package.

-tim
tfarrell.vcf

billf

unread,
Oct 8, 2008, 8:23:07 PM10/8/08
to web2py Web Framework
Tim - thanks for all the info. As a Python newbie I have never heard
of FormEncode.

Given what I know at this point I think I prefer to follow up your
first solution.

The first thing I didn't understand was why the form.accepts() needed
the name of the form in your view? This got me digging and html.py
and sqlhtml.py (great to see all the arguments available) shed a lot
of light but there are still a lot of blanks as to how the whole thing
works.

I have boiled all my questions down to: "Can someone please explain
the sequence of events embodied in the following?"

form=SQLFORM(db.recipe)
if form.accepts(request.vars,session):
response.flash="Successful" (or something)
return dict(form=form)

My version with holes is:
form=SQLFORM(db.recipe) > sqlhtml.py to create form from db.recipe

form.accepts(request.vars,session) > sqlhtml.py then calls
FORM.accepts() in html.py; if return is true then goes on to update db
> html.py
FORM.accepts() implemented by DIV.accepts()

Hole: I can't work out what is happening in DIV.accepts(). I'm
assuming there is some "first time" check - "we haven't any
request.vars yet" - that maybe uses the session but I can't see where
anything is stored in the session or how it uses the form name. Any
help greatly appreciated.

Hole: I assume that if form.accepts() returns false then it does not
necessarily mean that there are errors - it could just be that the
form hasn't been output yet. Is that correct?

Apologies if the questions are a bit vague.

Bill
>  tfarrell.vcf
> < 1KViewDownload

mdipierro

unread,
Oct 8, 2008, 10:04:35 PM10/8/08
to web2py Web Framework
accepts is called recursively by all objects. Most of them ignore it.
Some of them like INPUT, TEXTAREA and SELECT do not.
They validate the input, update their own, value, if there are errors,
update the error message.
validated values are stores in form.vars and error messages are stored
in form.errors

accepts returns True if there are get/post variables and the form
passes validation, else it is False.

deo

unread,
Oct 9, 2008, 10:28:00 AM10/9/08
to web2py Web Framework
Hello all,

I'm a newbie like billf and I'm trying to do some things, but I don't
see an easy way of doing them, maybe you can help me.

I have a question on Tim's solution of creating a form in the view and
replicating it in the action: how would I load values on the forms
fields ? Would I have to go something like "<input text = 'name'
value='{{= name}}'>" and pass the necessary values when rendering ?
Also, I think repeating the form structure in the code could create
problems later on, such as de-synchronizing the view and the action
(adding a field in one of them and forgetting to add on the other one
or even typos would cause a lot of hard to detect trouble).

I could bare building the form using the helpers in the action,
loading them with the values (like form.load(record)) and passing them
on to the view, but the only ways I know for loading values into the
fields are either creating the form with SQLFORM(table, record) (which
doesn't allow me to customize it at all) or putting them into the
_value attribute for each field (which becomes a lot of coding because
I can't use the SQLFORM.accepts for automatically inserting and
updating the db), is there any other way ?

As of now, I'm actually thinking of writing the form.load(record) and
form.load(dictionary) myself. Would that be repeating any feature I'm
not aware of ?

Thanks,

Deodoro Filho

mdipierro

unread,
Oct 9, 2008, 11:36:31 AM10/9/08
to web2py Web Framework
If I understand your question, your form.load(record) would be
form.vars.update(record)

Timothy Farrell

unread,
Oct 9, 2008, 11:49:21 AM10/9/08
to web...@googlegroups.com
Deo, welcome.  It's always good to have new faces and to hear that web2py is spreading.
Please see my answers below:

deo wrote:
<snip/>

I have a question on Tim's solution of creating a form in the view and
replicating it in the action: how would I load values on the forms
fields ? Would I have to go something like "<input text = 'name'
value='{{= name}}'>" and pass the necessary values when rendering ?
  
You are correct in your assumption.  Just at {{=valueVarName}} where you need to.  I don't much like this either but that's the way to do it with web2py templates.  This is not what I do, however.  I use Genshi for my templates instead of web2py templates (mostly because I prefer validating XML templates rather than text-based templates).  Genshi has this form-filler feature where I pass it a dictionary and it will fill an HTML form in my template without me having to templatize it as you suggested above.  If you have enough free time to learn Genshi, it would be a good tool to add to your belt, but it is significantly more complex than web2py templates.

Also, I think repeating the form structure in the code could create
problems later on, such as de-synchronizing the view and the action
(adding a field in one of them and forgetting to add on the other one
or even typos would cause a lot of hard to detect trouble).
  
Yah, that is an unfortunate downside and a concession I'm willing to make.  Consider that if you do even the slightest shred of testing on such a form, you'll catch those problems very quickly.

I could bare building the form using the helpers in the action,
loading them with the values (like form.load(record)) and passing them
on to the view, but the only ways I know for loading values into the
fields are either creating the form with SQLFORM(table, record) (which
doesn't allow me to customize it at all) or putting them into the
_value attribute for each field (which becomes a lot of coding because
I can't use the SQLFORM.accepts for automatically inserting and
updating the db), is there any other way ?
  
IDK, Massimo should be able to help you there or you can go browsing through the source code...it's a good read. =)
<snip/>
  

Cheers,
-tim
tfarrell.vcf

José Deodoro de Oliveira Filho

unread,
Oct 9, 2008, 4:00:54 PM10/9/08
to web...@googlegroups.com
On Thu, Oct 9, 2008 at 12:36 PM, mdipierro <mdip...@cs.depaul.edu> wrote:
>
> If I understand your question, your form.load(record) would be
> form.vars.update(record)
>

Hi again,

Sorry for the long email, it's kind of a big doubt for me.

I'm pretty sure I'm doing it wrong on behalf of inexperience, so I
really appreciate your help.

What I'm currently trying to do is to put the value of the parent
object in the new object I create. Say I have a table project that has
the title and user fields (a foreign key). I stored the user_id in the
session, this is what I do right now (simplified, of course):

(in model:)
...
db.project.description.default = "(default description)"
...
(in controller:)
def new_project():
f = FORM(INPUT(_name = "project_title", _type = "text"))
if f.accepts(request.vars, session):
db.project.insert(dict(title = f.vars.title, description =
f.vars.description, user = session.user_id))
redirect(URL(r = request, f = "list"))
else:
return dict(form = f)

My question is: is there some way of doing:
...db.insert.project(f.vars)...
?

I'd be awesome if I could make "user" a hidden field directly. That'd be like:

...f = SQLFORM(db.project, hidden = [db.project.user])
f.vars.user = session.user_id...

and then remove the db.project.insert line.

You see, I can't put user as a default value in the model, because it
changes from session to session. Right now the solution I got for
using SQLFORM is to set the default, which I don't like because I may
forget to reset it and add another project with the wrong user at
another point:

...f = SQLFORM(db.project, fields = ["title"])
db.project.user.default = session.user_id
if f.accepts(request.vars, session):...

There'a also Tim's solution, which is to replicate the form in the
view with the correct hidden field and create a "bogus" SQLFORM for
the accepts.

The other problem I ran into is I'd like to a "Back" button on the
forms, which forces me to go Tim's solution and manually an input tag
and a "value='{{=form.field}}'" attribute for each field on the
edit_project form.

So, what would be the "correct" way to do it ?

By the way, I just started on it but I just love it so far. The ORM is
the coolest ever and, although I'm aware there are more comprehensive
templating engines, I just love the simplicity of web2py's. Overall it
sometimes feels like Rails yet it has a way greater deal of finesse
into it.

Thanks,

Deodoro Filho

mdipierro

unread,
Oct 9, 2008, 5:04:22 PM10/9/08
to web2py Web Framework
Good questions. Answers below.

> (in controller:)
> def new_project():
> f = FORM(INPUT(_name = "project_title", _type = "text"))
> if f.accepts(request.vars, session):
> db.project.insert(dict(title = f.vars.title, description =
> f.vars.description, user = session.user_id))
> redirect(URL(r = request, f = "list"))
> else:
> return dict(form = f)
>
> My question is: is there some way of doing:
> ...db.insert.project(f.vars)...
> ?
>
> I'd be awesome if I could make "user" a hidden field directly. That'd be like:
>
> ...f = SQLFORM(db.project, hidden = [db.project.user])
> f.vars.user = session.user_id...
>
> and then remove the db.project.insert line.

There are many ways you can do it:

1) the recommended way

# list only the fields you want and pass the others directly to
the vars
f=SQLFORM(db.project,fields=['title'])
f.vars.user=session.user_id

2) use a hidden field


f=SQLFORM(db.project,fields=['title'],hidden=dict(user=session.user_id))
#but now the visitor can tamper with the hidden field in the form

3) Manually using

## vars has to be a dictionary (like form.vars) and must only
contain valid fields, not including id.
vars=form.vars
vars.user=session.user_id
db.project.insert(**vars)
## the ** unpacks the dictionary into named arguments

Jose de Oliveira Filho

unread,
Oct 9, 2008, 9:39:06 PM10/9/08
to web...@googlegroups.com
Thanks a bunch, Massimo. I completely overlooked the "hidden" thing
in the FORM source, but the first answer is what I was looking for.

I need to add an extra button to a SQLFORM, like "Save and Add
another". I could put it outside the form but it looks really bad,
any recommendations here ?

By the way, did you ever think of turning the SQLFORM generation into
divs instead of a table ?

Thanks again,

Deodoro Filho

mdipierro

unread,
Oct 10, 2008, 12:08:28 AM10/10/08
to web2py Web Framework
form is the form, form[0] is the table inside it. form[0][0] is the
first row. form[0][-1] is the last row, etc.
You can do

form[0].append(TR('Label',TAG.button('whatever'),'comment'))

You can add more attributes to your TAG.button

On Oct 9, 8:39 pm, Jose de Oliveira Filho <deodoro.fi...@gmail.com>
wrote:

billf

unread,
Oct 10, 2008, 6:57:52 AM10/10/08
to web2py Web Framework
I have gone down the route of using the following controller code
(I've left out a few checks for simplicity)

recipes=db(db.recipe.id==id).select()
recipe=recipes[0]
form=SQLFORM(db.recipe, recipe)
return dict(form=form)

... and in the view

<form name="{{=form.formname}}" method="post"
action="controller_name">
<input type="hidden" name="id" value="{{=form.record.id}}">

<label>Name:</label><input type="text" name="{{=form.formname}}_name"
size="50" maxlength="50" value="{{=form.record.name}}"/>
etc.

This seems to work well BUT I want to use the same view for insert and
update and when inserting there is no record! It would be great to be
able to call a function that creates an recipe record with id=0 and
all fields set to default values. It must be quite simple by
iterating through the columns of the table definition but I don't
really know enough yet to just code it. More importantly does the
function already exist? I don't want to rely on cloning an existing
instance.

Bill

DenesL

unread,
Oct 10, 2008, 10:08:42 AM10/10/08
to web2py Web Framework
What I would like to see is a form where the components are accesible
by field name.
I think you once said something about extending the SQLFORM class, any
rules on this?.

I am also siding with Jose on the use of DIVs instead of TRs since
they are more easily manipulated using CSS (e.g. http://jeffhowden.com/code/css/forms/
).

mdipierro

unread,
Oct 10, 2008, 10:28:26 AM10/10/08
to web2py Web Framework
OK just replace

recipe=recipes[0]

with

recipe=recipes[0] if recipes else None

José Deodoro de Oliveira Filho

unread,
Oct 10, 2008, 10:35:32 AM10/10/08
to web...@googlegroups.com
Just out of curiosity: I've gone that way and what I noticed is that I
loose the error divs, then I went back to using {{=form}}. Is that
correct ?

Deodoro Filho

mdipierro

unread,
Oct 10, 2008, 11:09:36 AM10/10/08
to web2py Web Framework
I do not understand what you mean. could you provide an examle?

On Oct 10, 9:35 am, "José Deodoro de Oliveira Filho"
<deodoro.fi...@gmail.com> wrote:
> Just out of curiosity: I've gone that way and what I noticed is that I
> loose the error divs, then I went back to using {{=form}}. Is that
> correct ?
>
> Deodoro Filho
>

José Deodoro de Oliveira Filho

unread,
Oct 10, 2008, 11:20:38 AM10/10/08
to web...@googlegroups.com
Sorry,

I mean I built a form, like Bill, manually:

>> >> <form name="{{=form.formname}}" method="post"
>> >> action="controller_name">
>> >> <input type="hidden" name="id" value="{{=form.record.id}}">
>>
>> >> <label>Name:</label><input type="text" name="{{=form.formname}}_name"
>> >> size="50" maxlength="50" value="{{=form.record.name}}"/>
>> >> etc.

And the drawback is that I miss the error divs generated by the
validators (which are a big plus), so I'd better stick to doing form =
SQLFORM(...) and passing it along to the view ({{=form}}). Am I
thinking correctly ?

Deodoro Filho

mdipierro

unread,
Oct 10, 2008, 12:18:41 PM10/10/08
to web2py Web Framework
Yes. There would be no error dislayed. The errors are in the dict
form.errors so you can insert things like

{{if form.errors.has_key('name'):}}Ops, error:{{=form.vars.name}}
{{pass}}

Massimo

On Oct 10, 10:20 am, "José Deodoro de Oliveira Filho"
<deodoro.fi...@gmail.com> wrote:
> Sorry,
>
> I mean I built a form, like Bill, manually:
>
> >> >> <form name="{{=form.formname}}" method="post"
> >> >> action="controller_name">
> >> >> <input type="hidden" name="id" value="{{=form.record.id}}">
>
> >> >> <label>Name:</label><input type="text" name="{{=form.formname}}_name"
> >> >> size="50" maxlength="50" value="{{=form.record.name}}"/>
> >> >> etc.
>
> And the drawback is that I miss the error divs generated by the
> validators (which are a big plus), so I'd better stick to doing form =
> SQLFORM(...) and passing it along to the view ({{=form}}). Am I
> thinking correctly ?
>
> Deodoro Filho
>

mdipierro

unread,
Oct 10, 2008, 12:22:30 PM10/10/08
to web2py Web Framework
Yes. There would be no error dislayed. The errors are in the dict
form.errors so you can insert things like

{{if form.errors.has_key('name'):}}Ops, error:{{=form.vars.name}}
{{pass}}

Massimo

On Oct 10, 10:20 am, "José Deodoro de Oliveira Filho"
<deodoro.fi...@gmail.com> wrote:
> Sorry,
>
> I mean I built a form, like Bill, manually:
>
> >> >> <form name="{{=form.formname}}" method="post"
> >> >> action="controller_name">
> >> >> <input type="hidden" name="id" value="{{=form.record.id}}">
>
> >> >> <label>Name:</label><input type="text" name="{{=form.formname}}_name"
> >> >> size="50" maxlength="50" value="{{=form.record.name}}"/>
> >> >> etc.
>
> And the drawback is that I miss the error divs generated by the
> validators (which are a big plus), so I'd better stick to doing form =
> SQLFORM(...) and passing it along to the view ({{=form}}). Am I
> thinking correctly ?
>
> Deodoro Filho
>

billf

unread,
Oct 10, 2008, 4:04:16 PM10/10/08
to web2py Web Framework
The problem I have is that when recipe=None, =form.record.any_field
fails hence the thinking that a "new" record containing defaults would
overcome this. I have had a stab with the following:

class SQLROW(SQLStorage):
"""
Return a row created from the table definition with values set to
defaults.
A row is represented as an SQLStorage object.
"""
def __init__(self,table):
for fieldname in table.fields:
field=table[fieldname]
value=field.default
if fieldname=='id':
value=0
if value==None:
value=''
self[fieldname]=value

usage: record=SQLROW(db.recipe) That may not fit into the web2py way
of naming but it's just an experiment :-)

My next problem is that to utilise the SQLFORM created in the
controller to allows accepts() and all the nice auto validation and db
updating, I believe my custom form in the view needs to contain 2
hidden fields holding the key and value of the form (to check with the
session). As far as I can see, these are generated when {{=form}} is
processed in the view, stored in the session and output in the
response. The underlying values are not accessible from the form,
e.g. =form.formkey - which is a shame. I am looking at how to call a
function on the SQLFORM from the view where the function would
generate just the part of xml() that generates the key/values, updates
the session and returns the input type="hidden" tags. An alternative
might be to set an indicator on the SQLFORM that is checked by xml()
to output all the form or just the hidden subset. Any thought greatly
welcomed.

Bill

billf

unread,
Oct 10, 2008, 6:25:45 PM10/10/08
to web2py Web Framework
Next installment :-/ (As a reminder, the objective is to create an
SQLFORM in the controller that can be used to validate/update using
request.vars from a separate custom form. The problem was how to
include the required formkey and formkey value in the custom form.)

Please note the changes described below are not intended as "this is
how it should be" but is really part of trying to understand how all
the bits fit.

i) In the controller, set a boolean attribute on SQLFORM namely
"customview"

ii) added a hiddenxml() method to FORM that outputs just the hidden
input controls not the whole form - basically a subset of xml()

iii) added an xml() method to SQLFORM:
if self.customview and customview==True:
return FORM.hiddenxm(self)
else:
return FORM.xml(self)

In my view, if it is not a custom form I just include {{=form}} and in
the controller form=SQLFORM(db.recipe). If I am using a custom form
then
in the view I include {{=form}} within my <form> and in the controller
add form.customview=True.

This appears to work, i.e. in the customview=True case I just get the
hidden fields included:
<input value="036227189211" type="hidden" name="_formkey" /><input
value="recipe" type="hidden" name="_formname" />

BUT... when the form is submitted and the formkeys are checked they
never match. It is more confusing because as I step thru the code
(EasyEclipse/PyDev) the formkeys in the session are constantly
changing. Can anyone suggest what I am missing?

Bill

mdipierro

unread,
Oct 10, 2008, 6:31:26 PM10/10/08
to web2py Web Framework
1) About SQLROWS below. I am not sure what it is supposed to do.
SQLFORM(table,None) should already pre-populate the form with default
values from table.field.default.

2) formname is in form.formname and defined in SQLFORM(formname='bla
bla')

3) formkey is in session._formkey but only AFTER the form is
serialized {{=form}} so it is not there if you have a custom form. You
have some options:

a) make your own key session._formkey=str(uuid.uuid4()) and place it
in the form.

b) do not pass "session" to "accepts" so that formkey will not be
used.

Massimo

mdipierro

unread,
Oct 10, 2008, 6:35:02 PM10/10/08
to web2py Web Framework
correction... formkey goes in

session['_formkey[%s]' % form.formname]

perhaps this variable should be set when the form is accepted, not
when serialized....

Massimo

billf

unread,
Oct 11, 2008, 12:58:09 AM10/11/08
to web2py Web Framework
Massimo

Thanks for your answers.

> 1) About SQLROWS below. I am not sure what it is supposed to do.
> SQLFORM(table,None) should already pre-populate the form with default
> values from table.field.default.

I asked the question Oct 10 11.57am "does a function already exist?"
but didn't get this answer so I had a go myself. When I try your
suggestion though, the default values are ONLY in
form.table.field.default. form.record is None. If I use
form.table.field.default in my custom form there are 2 problems:
i) it doesn't reflect user input so next time through the form is back
to displaying defaults
ii) defaults are not set implicitly, i.e. a string without a
default='' is None

This doesn't really give me what I want. If I go back to my solution
of creating a record containing defaults I now realise that I have
another problem:

If my custom form uses form.record.some_attribute it is is ok first
time thru - it has defaults - but after user input it is still just
the original values.
If my custom form uses form.vars.some_attribute then first time thru
it is empty but after user input it reflects the user input.
Conclusion: there are 2 ways to get the latest value of a form
attribute:
i) merge table.default and vars - although I am not sure that it is as
simple as that, or
ii) extract the value from components (which is in effect the result
of i) as done by accepts()) - I think this is best approach

So I really have 2 problems: i) a consistent source of the latest form
values and ii) formkeys - although this can be avoided by omitting the
session from accepts(). My current thinking is that if a custom view
is being used then SQLFORM should be able to create a visible dict of
latest values (including formkey values) that can be accessed via
=form.latest.my_attribute or similar.

This has the added plus that form.record isn't required so Massimo's
SQLFORM(db.recipe, None) is ok and my SQLROW is redundant - hurrah!

Should this be done in accepts() along with creating the formkeys (see
3) below or when form is serialized {{=form}}? It is probably more
efficient to do it in accepts() or more specifically postprocessing()
as that is where the component is updated I think.

> > 2) formname is in form.formname and defined in SQLFORM(formname='bla
> > bla')

I have no problem getting formname. That is set whether formname='bla
bla' or not.

> > 3) formkey is in session._formkey but only AFTER the form is
> > serialized {{=form}} so it is not there if you have a custom form. You
> > have some options:
>
> > a) make your own key session['_formkey[%s]' % form.formname]=str(uuid.uuid4()) and place it
> > in the form.
>
I could do this but my attempts wanted to use the existing formkey
code. Anyway, a long-term solution would not want this in all
controllers so it would end up in FORM or SQLFORM anyway(?)

> > b) do not pass "session" to "accepts" so that formkey will not be
> > used.

I guess the check vs session is there for a good reason so any
acceptable solution should support it.

> later post) perhaps this variable should be set when the form is accepted, not
> when serialized....

As I said in an earlier post, I had sussed this and as long as I
wanted to use the existing formkey code I had to modify the xml()
behaviour (actually bypass it) to avoid getting the whole form back.
Should the variable be set in accepts() - see last bit of 1) above.

Bill
Reply all
Reply to author
Forward
0 new messages