I have a question: When we say '2 forms', I immediately think 2 forms,
in the sense that both forms are used at times separately, and at
other times, combined. When I think of subforms, I think of either 1
of 2 things: 1) it wouldn't make any sense to have that form stad on
its own (it may be useful in many situations, but never alone. 2) the
subform can go both ways, on its own (requires contexte) and as a
another form's subform (avoids duplication). So, I'm trying to
understad the language used here and t see if I am possibly not doing
something correctly. my take is (and this is where I get "iffy" about
combining forms vs combining tables. It seems to me that the meat in
in the tables where the forms are just there to capture data. That
said, what is the main advantage with combining forms over combining
tables?
Is there any disadvantage to collecting related data to populate a
tables different tables, even if it includes many of those single
value tables (like table category), and building the form by
collecting pertinent tables to create the single, stands-on-its-own
form? and kind of goes to the :audit trail slice. for one particular
app (a requests app), instead of thinking of combining forms to
create a unique request, I isolated items that could potentially be of
value in more than 1 situation. I used the "audit trail" slice's
technique to achieve this. In the end depending on how and which
tables I combine, I can create unique forms with specific use if the
combined data. I treat the forms like recipes (table noodle goes to
combined_table_spaghetti, or to combined_table_soup, etc,,, would even
go to combined_table_Arts_And_Krafts if noodles were used. If I were
missing a table glue, I would have something (a button or something)
to create a table instead of a row.
example:
table_a is common to al request (general info)
table_b can be source code specific
table_c can IMEI specific
table_d can info about the dev cert
table_e can be a a table with a single field (like yes/no thing)
table_a + table_b = build request form
table_a + table_c = IMEI number request form
table_a + table_c + table_d = dev cert request form
then all I need is to create a dev cert request form is this and throw
a form on it:
db.define_table('dev_cert_request',
table_a,
table_c,
table_d,
table_e,
Field('have_device_already', 'boolean'))
So the question: is there and advantage to working with the forms as
opposed to working with the tables? working with tables seems more
flexible and intuitive and is a time saver (re-using existing tables),
but maybe I have the wrong approach regardless and trouble is waiting
for me at some point?
Thanks
Mart :)
On Jan 21, 4:39 pm,
Lennon <[email protected]> wrote:
> Oh I see. The validation does at least seem to be working on the
> second form. It won't let me enter values not specified in the model.
>
> If I am to use SQLFORM factory, how do I do an update/delete?
>
> Kenneth said:
>
> "As I understand the only option is to use factory, if you wan t to
> update you have to create a form with factory then fill all fields
> with
> db.t_table.f_field.value = something"
>
> But I'm not exactly sure how to fill the fields in with that method.
> Could somebody give me an example in the following context?:
>
> def test_add_user():
> form=SQLFORM.factory(db.user,db.address)
> if form.accepts(request.vars):
> id = db.user.insert(**db.client._filter_fields(form.vars))
> form.vars.client=id
> id = db.address.insert(**db.address._filter_fields(form.vars))
> response.flash='Thanks for filling the form'
> return dict(form=form)
>
> On Jan 21, 4:22 pm, DenesL <[email protected]> wrote:
>
>
>
>
>
>
>
> > Doing form.append(SQLFORM(...)) creates invalid HTML since you can not
> > nest FORMs, but your browser is saving the day by ignoring the nested
> > form and including its fields only.
>
> > Moreover form.accepts only validates your db.user fields, and none of
> > db.address (unless they happen to be named the same).
>
> > You should be following what Bruno
> > recommended:http://web2pyslices.com/main/slices/take_slice/102
>
> > On Jan 21, 3:48 pm, Lennon <[email protected]> wrote:
>
> > > I solved my problem. Since the form.vars were passing through to the
> > > controller, I just simply did my own manual insert:
>
> > > def test_add_user():
>
> > > form = SQLFORM(db['user'])
> > > form.append(SQLFORM(db['address']))
>
> > > #submit data
> > > if form.accepts(request.vars):
>
> > > #check whether the form had errors
> > > if form.errors:
> > > response.flash = 'Form has errors'
> > > return dict(form=form)
> > > else:
>
> > > db.address.insert(user_id=form.vars.id,address=form.vars.address)
> > > session.flash = "User Added"
> > > redirect(URL('admin', 'test_add_user'))
>
> > > #return the view
> > > return dict(form=form)
>
> > > Now all I have to do is remove the first submit button.
>
> > > On Jan 21, 2:30 pm, Lennon <[email protected]> wrote:
>
> > > > I have two reasons for not wanting to use SQLFORM factory. First, I
> > > > can't figure out or find how to use SQLFORM factory as an update/
> > > > delete form when combining multiple table (although I'd love to see
> > > > how if it can be done). Second, I will be wanting to do some really
> > > > complicated forms in the future and would like to understand how to
> > > > combine SQLforms.
>
> > > > With the insert form code listed below, I've been able to combine the
> > > > two forms on one page. They both render (with two submit buttons) and
> > > > the form validation works for both of them regardless of which submit
> > > > button I hit (which made me think I had successfully combined them).
>
> > > > But when the form accepts the data, it only does an insert on the
> > > > original form and doesn't work on the appended form.
>
> > > > When I run in debug mode I see that FORM.vars correctly has captured
> > > > all of the values for both forms. But FORM.table and FORM.fields both
> > > > only have the values for the first SQLFORM.
>
> > > > Thanks for any help you can give me.
>
> > > > def test_add_user():
>
> > > > form = SQLFORM(db['user'])
> > > > form.insert(len(form),SQLFORM(db['address']))
>
> > > > #submit data
> > > > if form.accepts(request.vars):
>
> > > > #check whether the form had errors
> > > > if form.errors:
> > > > response.flash = 'Form has errors'
> > > > return dict(form=form)
> > > > else:
>
> > > > session.flash = "User Added"
> > > > redirect(URL('admin', 'test_add_user'))
>
> > > > #return the view
> > > > return dict(form=form)