To see where I'm going with this, I've modified the controller to use the base read/create/update controller (setsubmit) so it can be used with a minimum of new code. Here is the new version adding a controller 'authdata' for the auth_user table:
def index(): session.action = "update" # redirect(URL(r=request,f='testdata')) redirect(URL(r=request,f='authdata')) @auth.requires_login() def testdata(): if request.args: id = request.args[0] else: id = 3 # Included for testing x = eval(setsubmit("testtable")) return dict(form=x) @auth.requires_login() def authdata(): if request.args: id = request.args[0] else: id = 1 # Included for testing x = eval(setsubmit("auth_user")) return dict(form=x) def setsubmit(table): if request.vars.submit1: session.action = "create" if request.vars.submit2: session.action = "update" if request.vars.submit3 or request.vars.submit4: session.action = "read" cmd = "crud."+session.action+"(db."+table if session.action in ['read','update']: cmd += ",id)" else: cmd += ")" return cmd def data(): response.view="%s/%s/%s.html" % (request.controller,request.function, request.args[0]) return dict(form=crud()) def user(): return dict(form=auth()) Although I'm sure this can be improved (maybe by using response.form and passing the table name), by adding a just the controller 'authdata' and creating a 'default/authdata.html custom view, the logic works for the new custom form with a minimum of effort. I believe that a small program could be written to create a skeleton of the view that would take most of the work out of the process. I saw on AlterEgo at http://mdp.cti.depaul.edu/AlterEgo/default/show/82 that Massimo built a small application to create this functionality from SQL. I hope that this will be helpful to the project. Regards, Gary PS. Here's the view (default/authdata.html) for the above: {{extend 'layout.html'}} <h1>Auth_data {{if session.action == "update":}} Update {{elif session.action == "create":}} Add {{pass}} </h1> <form action="" enctype="multipart/form-data" method="post"> <table> <tr id="auth_user_first_name__row"> <td><label for="auth_user_first_name" id="auth_user_first_name__label">First Name: </label></td> {{if session.action in ["update","create"]:}} <td><input class="string" id="auth_user_first_name" name="first_name" type="text" value="{{=form.custom.inpval.first_name}}" /></td> {{else:}} <td>{{=form.custom.inpval.first_name}}</td> {{pass}} <td></td></tr> <tr id="auth_user_last_name__row"> <td><label for="auth_user_last_name" id="auth_user_last_name__label">Last Name: </label></td> {{if session.action in ["update","create"]:}} <td><input class="string" id="auth_user_last_name" name="last_name" type="text" value="{{=form.custom.inpval.last_name}}" /></td> {{else:}} <td>{{=form.custom.inpval.last_name}}</td> {{pass}} <td></td></tr> <tr id="auth_user_email__row"><td> <label for="auth_user_email" id="auth_user_email__label">Email: </ label></td> {{if session.action in ["update","create"]:}} <td><input class="string" id="auth_user_email" name="email" type="text" value="{{=form.custom.inpval.email}}" /></td> {{else:}} <td>{{=form.custom.inpval.email}}</td> {{pass}} <td></td></tr> {{if session.action == "update":}} <tr id="delete_record__row"> <td><label for="delete_record" id="delete_record__label">Check to delete:</label></td> <td><input class="delete" id="delete_record" name="delete_this_record" type="checkbox" value="off" /></td> <td></td></tr> {{pass}} </table> {{include 'buttons.html'}} On May 3, 10:13 pm, dlypka <dly...@gmail.com> wrote: > Well you've done me a great service by creating this sample. > > I went a bit further and got some partial success by just changing > this one line: > > <tr id="testtable_testfield1__row"> > <td> > <label for="testtable_testfield1" > id="testtable_testfield1__label">Testfield1: </label> > </td> > {{if session.action == "update":}} > <td> > > {{ =INPUT(_type='text', _id='testtable_testfield1', > _name='testfield1', value="abc", requires=IS_NOT_EMPTY())}} <--- > This is the changed line > > </td> > {{elif session.action == "create":}} > > This now causes both 'testfield1' fields to mirror each other. > Well, now we have 2 fields with the same name 'testfield1', so that is > not too great. > We would need a way to tell CRUD to NOT call INPUT > I also have not figured out how to set value = to the actual current > field value. > > I'll keep working at it in my spare time.. > > On May 3, 9:15 pm, Gary <gary.k.ma...@gmail.com> wrote: > > > Folks, > > > I've taken note of your comments and work to help me with this. > > Although I'm afraid that I don't have the skills to participate, I > > really appreciate your efforts. > > > Kindest regards, > > Gary > > > On May 3, 8:59 pm, dlypka <dly...@gmail.com> wrote: > > > > FYI > > > If someone tries to run your code on a fresh empty db, > > > then they need to first > > > create a record in the database > > > and im that case, the record would have id=1 > > > and so in your code > > > > def testdata(): > > > setsubmit() > > > if request.args: id = request.args[0] > > > else: id = 3 # Included for testing > > > > It should be > > > > def testdata(): > > > setsubmit() > > > if request.args: id = request.args[0] > > > else: id = 1 # default to read the first record > > > > On May 3, 8:16 pm, dlypka <dly...@gmail.com> wrote: > > > > > The objects in gluon/html.py appear to be what I would call 'controls' > > > > whereas the objects in gluon\sqlhtml.py are 'widgets'. > > > > > So I see that Crud uses controls and SQLFORM uses widgets. > > > > > I am hoping to find a way to use a control in the View markup rather > > > > than in the Controller. > > > > I believe that is what Gary needs to do. > > > > > On May 3, 7:48 pm, Álvaro Justen [Turicas] <alvarojus...@gmail.com> > > > > wrote: > > > > > > On Sun, May 3, 2009 at 7:32 PM, dlypka <dly...@gmail.com> wrote: > > > > > > > because **inside** the crud() call I believe it (magically) does > > > > > > this kind of stuff: > > > > > > > def test(): > > > > > > f = FORM('Is web2py cool? Why?', > > > > > > SELECT(OPTION('Yes', _value='y'), OPTION('No', > > > > > > _value='n'), _name='opts', requires=IS_IN_SET(['y'], > > > > > > error_message='Errr...wrong answer')), > > > > > > INPUT(_type='text', _name='why', _value="'cause python > > > > > > rules", requires=IS_NOT_EMPTY()), > > > > > > INPUT(_type='submit', _name='btnSubmit', _value='ok')) > > > > > > if f.accepts(request.vars): > > > > > > response.flash = 'form accepted' > > > > > > elif request.vars.btnSubmit: > > > > > > response.flash = 'error in form' > > > > > > return dict(myform=f, v=request.vars) > > > > > > > so in particular crud() generates those INPUT objects for you, and > > > > > > the > > > > > > INPUT object is the thing which > > > > > > creates the error attribute inside that INPUT object instance which > > > > > > then satisfies 'hasattr()' So I believe the solution for you is to > > > > > > make an INPUT call yourself within the markup, in {{ }} (somehow). > > > > > > Probably we need to modify the INPUT class Python code > > > > > > to support that. Basically you need to bind your own instance of an > > > > > > INPUT class, to the part of your form where you need the <input> > > > > > > tag. > > > > > > Crud uses SQLFORM to generate forms and SQLTABLE to present data. See > > > > > gluon/tools.py, class Crud and tools/sqlhtml.py, classes SQLFORM and > > > > > SQLTABLE. > > > > > > -- > > > > > Álvaro Justen > > > > > Peta5 - Telecomunicações e Software Livre > > > > > 21 3021-6001 / 9898-0141 > > > > > http://www.peta5.com.br/-Hidequotedtext- > > > > > > - Show quoted text -- Hide quoted text - > > > > > - Show quoted text -- Hide quoted text - > > > - Show quoted text - --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "web2py Web Framework" group. To post to this group, send email to web2py@googlegroups.com To unsubscribe from this group, send email to web2py+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/web2py?hl=en -~----------~----~----~----~------~----~------~--~---