You still can enter only one related item (record) at a time in the combined tables form... How can you add the many differents address of one client in address table in one time to have a normalized schema?
There is also a 3 (4 in case you want to store the type of phone you have : Home, mobile, etc.) tables needed in case you want to store phone number for example : Client Address Phone PhoneType AddressType could be also interresting... Richard On Fri, Jan 21, 2011 at 11:50 PM, mart <[email protected]> wrote: > 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) >

