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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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] <[email protected]>
> > > > wrote:
>
> > > > > On Sun, May 3, 2009 at 7:32 PM, dlypka <[email protected]> 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 [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
-~----------~----~----~----~------~----~------~--~---