Massimo,
I am sorry, I will try to be more explicite here:
the model (two tables user and addr)
db.define_table('user',
Field('name', length=12, requires=IS_NOT_EMPTY()),
Field('alias',length=12 ),
Field('rname', length=28),
Field('gender', requires=IS_IN_SET(['Male', 'Female',
'Other'])),
Field('email', length=12),
Field('password','password'),
Field('created_on','date'),
Field('console','boolean',default=False),
Field('verification',default=''),
Field('last_attempt_time','integer',default=0),
Field('failed_attempts','integer',default=0))
db.user.name.requires=IS_NOT_IN_DB(db,'user.name',
error_message='value already
in DB')
db.user.password.requires=CRYPT()
db.user.email.requires=[IS_EMAIL(),IS_NOT_IN_DB(db,'user.email')]
db.user.public_fields=['name', 'alias','rname', 'email','password',
'reg_date','console']
db.user.public_labels={'name':'User Name', 'alias':'User Alias',
'rname':'Real Name', 'created_on':'Member
since',
'console':'Console Login'}
VALID_USER=IS_IN_DB(db(db.user.verification==''),'user.id','%(id)s:%
(name)s')
# addr table
db.define_table('addr',
Field('user', db.user),
Field('zip'),
Field('city'),
Field('street'),
Field('number'),
Field('country'),
Field('phone_short'),
Field('phone_office'),
Field('phone_home'),
Field('phone_mobile'),
Field('fax'),
Field('birth', 'date'),
Field('notes','text'))
from these two tables I get the record data in the controller function
like this:
def edit_user():
if len(request.args):
req_user_id = request.args[0]
# if current user is not a member of system manager group
# he cannot edit any records except his own
if not is_member("Systems") and session.user_id != int
(req_user_id):
session.flash = 'sorry, no sufficient access rights'
redirect(URL(r=request,f='index'))
user = db((db.user.id == req_user_id) &
(db.addr.user == req_user_id)).select()[0]
db.user.id.default = user.user.id
db.user.name.default = user.user.name
db.user.email.default = user.user.email
db.addr.city.default = user.addr.city
form = SQLFORM.factory(db.user.name, db.user.rname,
db.addr.city)
###
### this call doesn't work due to no_table issue
###
if form.accepts(request.vars, session):
# change the user data
if change_user_data(user):
response.flash = 'form accepted'
else:
response.flash = 'form not accepted'
redirect(URL(r=request,f='index'))
elif form.errors:
response.flash = 'form has errors'
return dict(form=form)
what I would like to do now is to place the fields in the view where I
think it males most sense like:
name zip city
rname street number
etc.
submit
after submit the records in both tables should be updated, means when
I changed the street the record in addr table gets updated, some field
from user table and this one gets updated. It's okay updating all
records of both tables when submit button getts pressed.
I do not have preferences for either SQLFORM or FORM or
SQLFORM.factory. What ever is easier and less hard to read.
I am also fine with doing plain old HTML manually in the view as long
as I can access the field values and place the fields where ever I
want them and as long as I can get that information change back to the
controller that is supposed to update my records.
Thanks for getting into it with me.
ciao
Stefan
On 26 Okt., 19:38, mdipierro <[email protected]> wrote:
> Stephan,
>
> I think I am not completely understanding what you need. can you make
> a concrete example of a model, how the model should look like (use a
> drawing or text) and what should happen when the form is submitted?
>
> Massimo
>
> On Oct 26, 1:33 pm, znafets <[email protected]> wrote:
>
> > @weheh: I saw that but couldn't take too much from it
> > @Thadeus: Woooa, that looks like for a second generation BF compiler -
> > I am blinded :) , thank you anyway
> > @Massimo: I knew you would like that highly sophisticated stuff but
> > please don't ask me if it helps to solve my problem, or better put: is
> > this the only solution to that use case I described ? Then I guess
> > this is way out of my league and incomprehensible for my old eyes.
>
> > I adored web2py so far for being easy to use and elegant, but in this
> > specific case I am willing to rethink that impression in a way that it
> > may be easy as long as one stays on well flattened roads leading to
> > standard views with minimum customization. Once you are passed that it
> > seems to get really hairy.
>
> > to recap:
> > getting data from two tables displayed in a view with fields that are
> > supposed to appear where I want them, pre-filled with the data that is
> > already in the db is this the only way to do it in web2py ?
> > seriously ? No easier, better, smoother way ?
>
> > ciao
> > Stefan
>
> > On 26 Okt., 18:00, mdipierro <[email protected]> wrote:
>
> > > An aesthetic issue. Consider you can replace:
>
> > > {{
> > > def req():
> > > return XML('''<span class="required">*</span>''')
>
> > > }}
>
> > > with
>
> > > {{req=SPAN("*",_class="required")}}
>
> > > and call it with {{=req}} or
>
> > > {{def req():}}<span class="required">*</span>{{return}}
>
> > > and call it with {{req()}} (no equal)
>
> > > Massimo
>
> > > On Oct 26, 11:51 am, Thadeus Burgess <[email protected]> wrote:
>
> > > > This is usually what I end up doing for custom form. It allows for fully
> > > > customizable XHTML/CSS 3 forms.
>
> > > > {{
> > > > def req():
> > > > return XML('''<span class="required">*</span>''')}}
>
> > > > {{pass}}
>
> > > > {{def labels(field, required):}}
> > > > <label for="{{=field}}" id="{{=field}}__label"
> > > > class="title">{{=form.custom.label[field]}}{{if
> > > > required:}}{{=req()}}{{pass}}</label>
> > > > <label for="{{=field}}" id="{{=field}}__comment"
> > > > class="comment">{{=form.custom.comment[field]}}</label>
> > > > <label for="{{=field}}" id="{{=field}}__error"
> > > > class="error">{{if
> > > > form.errors.has_key(field):}}{{=form.errors[field]}}{{pass}}</label>
> > > > {{pass}}
>
> > > > {{def li(field, required=True):}}
> > > > <li {{if form.errors.has_key(field):}}class="err"{{pass}}>
> > > > <div class="labels">
> > > > {{labels(field, required)}}
> > > > </div>
> > > > {{=form.custom.widget[field]}}
> > > > </li>
> > > > {{pass}}
>
> > > > {{=form.custom.begin}}
>
> > > > <fieldset>
> > > > <legend></legend>
> > > > <ol>
> > > > {{li('signup_code')}}
> > > > </ol>
> > > > </fieldset>
>
> > > > <fieldset>
> > > > <ol>
> > > > <li>
> > > > <div class="labels">
> > > > <label for="submit" class="title">Click to finish and
> > > > submit
> > > > your information.</label>
> > > > </div>
> > > > <input type="submit" class="submit" value="Submit" />
> > > > </li>
> > > > </ol>
> > > > </fieldset>
>
> > > > {{=form.custom.end}}
>
> > > > -Thadeus
>
> > > > On Mon, Oct 26, 2009 at 7:43 AM, weheh <[email protected]>
> > > > wrote:
>
> > > > >http://groups.google.com/group/web2py/browse_thread/thread/c6e3021507...
>
> > > > > On Oct 26, 7:55 am, znafets <[email protected]> wrote:
> > > > > > the call to form.accepts fails with "key error" no-table ... after
> > > > > > the
> > > > > > form gets submitted...
>
> > > > > > if form.accepts(request.vars, session):
>
> > > > > > On 26 Okt., 11:05, znafets <[email protected]> wrote:
>
> > > > > > > Hi Thadeus, weheh,
>
> > > > > > > if I make it read like this:
>
> > > > > > > req_user_id = request.args[0]
>
> > > > > > > user = db((db.user.id == req_user_id) &
> > > > > > > (db.addr.user ==
> > > > > > > req_user_id)).select()[0]
>
> > > > > > > db.user.id.default = user.user.id
> > > > > > > db.user.name.default = user.user.name
> > > > > > > db.user.email.default = user.user.email
> > > > > > > db.addr.city.default = user.addr.city
>
> > > > > > > form = SQLFORM.factory(db.user.name, db.user.rname,
> > > > > > > db.addr.city)
>
> > > > > > > pre populating works.
>
> > > > > > > @weheh: can you post an example how you take it from there with
> > > > > > > the
> > > > > > > custom.form technics ?
>
> > > > > > > thanls
> > > > > > > Stefan
>
> > > > > > > On 26 Okt., 07:06, weheh <[email protected]> wrote:
>
> > > > > > > > This is an unsolicited testimonial. I've been doing this kind of
> > > > > > > > multi-
> > > > > > > > table-form thing now for about a month or two. I collect data
> > > > > > > > for
> > > > > > > > specific fields for multiple tables (2 or 3 at a time) using
> > > > > > > > SQLFORM.factory forms and use form.custom.begin ...
> > > > > > > > form.custom.end
> > > > > > > > in
> > > > > > > > my views. At first, it felt all cold, slobbery and gross.
> > > > > > > > Utterly
> > > > > > > > unintuitive. A total WET (Widespread Echoed Text) LICK (Long
> > > > > > > > Incredibly
> > > > > > > > Chaotic Kode). But now that I've sort'a mastered it and
> > > > > > > > refactored
> > > > > > > > everything, it feels kind'a like a warm DRY KISS. I agree with
> > > > > > > > Thadeus, it ain't pretty, at least not as pretty as straight
> > > > > > > > SQLFORM
> > > > > > > > or FORM or CRUD. But it works. And it gives you complete
> > > > > > > > flexibility
> > > > > > > > in terms of form structure and layout while maintaining a
> > > > > > > > separate
> > > > > > > > database structure that's designed for efficiency rather than
> > > > > > > > easy
> > > > > > > > form layout. Is there a better way? I dunno ... my mind can't
> > > > > > > > lift
> > > > > > > > heavy loads like that any more. Anyway, that's as far as my 2
> > > > > > > > cents
> > > > > > > > goes. Cheers.
>
> > > > > > > > On Oct 25, 2:11 pm, Thadeus Burgess <[email protected]>
> > > > > > > > wrote:
>
> > > > > > > > > Ah yes, forgot to add the field to the end of it. Thats what
> > > > > happens when I
> > > > > > > > > write code in email :)
>
> > > > > > > > > SQLFORM.factory(db.user.name, db.address.street)
>
> > > > > > > > > -Thadeus
>
> > > > > > > > > On Sun, Oct 25, 2009 at 12:38 PM, mdipierro <
> > > > > [email protected]> wrote:
>
> > > > > > > > > > This
>
> > > > > > > > > > > SQLFORM.factory(
> > > > > > > > > > > db.user, db.address
> > > > > > > > > > > )
>
> > > > > > > > > > will not quire work because both tables contain an Id
> > > > > > > > > > field. I
> > > > > think
> > > > > > > > > > you need to explicitly list the fields to you want.
>
> > > > > > > > > > Massimo
>
> > > > > > > > > > On Oct 25, 11:50 am, Thadeus Burgess <[email protected]>
> > > > > wrote:
> > > > > > > > > > > znafets, Keeping the thread in this post...
>
> > > > > > > > > > > user = db((db.user.id == request.id) &
> > > > > > > > > > > (db.address.id_user ==
> > > > > request.id
> > > > > > > > > > > )).select()
>
> > > > > > > > > > > db.user.id.default = user.id
> > > > > > > > > > > db.user.name.default = user.name
> > > > > > > > > > > db.user.email.default = user.email
>
> > > > > > > > > > > SQLFORM.factory(
> > > > > > > > > > > db.user, db.address
> > > > > > > > > > > )
>
> > > > > > > > > > > Is there another way of doing this? To me, this is not
> > > > > > > > > > > DRY or
> > > > > KISS.
>
> > > > > > > > > > > -Thadeus
>
> > > > > > > > > > > On Sat, Oct 24, 2009 at 3:20 PM, Renato-ES-Brazil
> > > > > > > > > > > <[email protected]>wrote:
>
> > > > > > > > > > > > Massimo,
>
> > > > > > > > > > > > Sorry, your message to Thadeus, which also answered my
> > > > > question,
> > > > > > > > > > > > appeared only after, when I sent my question to this
> > > > > > > > > > > > topic.
>
> > > > > > > > > > > > My example had just one table because it was a simple
> > > > > > > > > > > > test
> > > > > with
> > > > > > > > > > > > SQLFORM.factory.
>
> > > > > > > > > > > > I thought it worked this way that you mentioned, but
> > > > > > > > > > > > when I
> > > > > saw that
> > > > > > > > > > > > the SQLFORM.factory allows to send some parameters like
> > > > > > > > > > > > "db.table.field" instead of using Field(), I got
> > > > > > > > > > > > confused.
> > > > > :-)
>
> > > > > > > > > > > > On 24 out, 18:07, mdipierro <[email protected]>
> > > > > > > > > > > > wrote:
> > > > > > > > > > > > > A SQLFORM.factory has no knowledge of the underlying
> > > > > database. If you
> > > > > > > > > > > > > use SQLFORM.factory you should do the inserts/update
> > > > > manually.
>
> > > > > > > > > > > > > In your case your form involves a single table so you
> > > > > should just use
> > > > > > > > > > > > > crud.create or crud.update
> > > > > > > > > > > > > use db.table.field.writable and
> > > > > > > > > > > > > db.table.field.readable and
> > > > > > > > > > > > > db.table.field.default to change the behavior of the
> > > > > > > > > > > > > form.
>
> > > > > > > > > > > > > On Oct 24, 3:02 pm, Renato-ES-Brazil <
> > > > > [email protected]>
> > > > > > > > > > wrote:
>
> > > > > > > > > > > > > > Massimo,
>
> > > > > > > > > > > > > > I tried to use SQLFORM.factory just for tests:
>
> > > > > > > > > > > > > > def edit():
> > > > > > > > > > > > > > task_id = request.args(0)
> > > > > > > > > > > > > > task=db(db.task.id==task_id).select()[0]
> > > > > > > > > > > > > > form=SQLFORM.factory(db.task.title,
> > > > > db.task.description,
> > > > > > > > > > > > > > record=task)
> > > > > > > > > > > > > > if form.accepts(request.vars, session):
> > > > > > > > > > > > > > response.flash = 'form accepted'
> > > > > > > > > > > > > > elif form.errors:
> > > > > > > > > > > > > >
>
> ...
>
> Erfahren Sie mehr »
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"web2py-users" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/web2py?hl=en
-~----------~----~----~----~------~----~------~--~---