+1 for the latter, I totally forgot to point also the error on form.vars ....
@david, try the last one by mdipierro and tell us if the problem of submitting the form goes away.. Niphlod On 23 Ago, 03:28, mdipierro <mdipie...@cs.depaul.edu> wrote: > Your code can be simplified as follows: > This is incorrect: > form.vars.user.writable = False > I assume you mean: > db.services.user.writable = False > > It is not a good idea to define a form in a if block, i.e. in a > different scope than the the form.accepts. Try this instead: > > @auth.requires_login() > def services(): > record = db.services(user=auth.user.id) # returns None if record > not found > db.services.user.writable = False > db.services.user.default = auth.user.id > form = SQLFORM(db.services, record, deletable=False) # update or > create depending on record > if form.accepts(request.vars, session): > response.flash = 'form accepted' > elif form.errors: > response.flash = 'form has errors' > return dict(form=form) > > On Aug 22, 3:48 pm, Niphlod <niph...@gmail.com> wrote: > > > > > usually I'll do something like that: > > > 1. @auth.requires_login() > > 2. def services(): > > 3. record = db(db.services.user==auth.user.id).select().first() > > 4. if record: > > 5. form = SQLFORM(db.services, record, deletable=False) > > 6. form.vars.user.writable = False > > 7. else: > > 8. form = SQLFORM(db.services) > > 9. form.vars.user.default = auth.user.id > > 10. form.vars.user.writable = False > > 11. if form.accepts(request.vars, session): > > 12. response.flash = 'form accepted' > > 13. elif form.errors: > > 14. response.flash = 'form has errors' > > 15. return dict(form=form) > > > changes made to your implementation: > > a) request.args are needed to catch something "after" something/ > > default/services ... that line is copy/pasted from the book but in > > your context it doesn't mean anything...actually the URL with that is > > needed to be like something/default/services/xxx where xxx is an > > identifier of the record to edit. Since you want only one record per > > user, request.args use is meaningless. > > > so, "if len(request.args)" is missing totally. > > > b) if there's only one record per user, you can select directly the > > row with .first() , no need to retain the set (multiple rows object) > > if there aren't going to be multiple records per user. > > .first() return a row or None if non-existent, hence the "if record:" > > on line 4. > > > c) if record exists, form will be "editable" of the row "record" (with > > records[1] you were doing quite a mess....actually selecting the 2nd > > row of your set, python enumeration starts from [0], not from > > [1]!!) . > > on line 6. and 10. "form.vars.user.writable = False" give yourself > > some protection .... actually if you don't do this you'll end up > > giving away the chance to your users to change the "user" field, > > "assigning" his "services" row to another user.... definitely not the > > way to go. I'll be happy to set also form.vars.user.readable = False > > to hide the field at all, but that's your choice. > > > Feel free to ask more if you're concerned by something or if you > > didn't understand all. > > > Niphlod- Nascondi testo citato > > - Mostra testo citato -