Try:
form = SQLFORM(db.auth_user, user, showid=False)
is_administrator = user and auth.has_membership(user_id=user.id,
role='Administrators')
form[0].insert(-1, TR((
TD(LABEL('Is Administrator', _for='auth_user_is_administrator')),
TD(INPUT(_type='checkbox', _name='is_administrator',
_id='auth_user_is_administrator',
value=is_administrator)))))
Notice, instead of pre-populating the is_administrator field via
form.vars.is_administrator=[value], the above pre-populates the filed by
setting the 'value' argument of the INPUT helper. It appears that using the
form.vars method does not work when the form/table doesn't contain a Field
object for the field being pre-populated.
Anthony
On Monday, June 13, 2011 9:21:51 PM UTC-4, Ross Peoples wrote:
> I am trying to provide an editor for auth_user using SQLFORM. I also am
> trying to add a checkbox to the bottom of the form to set whether or not the
> user is an administrator. If so, then the user gets added to an
> Administrators group when calling form.accepts().
>
> The strange part is, the code works fine if you check the box, then click
> submit, but if you try to uncheck the box, that's when you get the following
> traceback:
>
> 1.
> 2.
> 3.
> 4.
> 5.
> 6.
> 7.
> 8.
> 9.
> 10.
> 11.
> 12.
> 13.
> 14.
> 15.
> 16.
> 17.
> 18.
> 19.
> 20.
> 21.
> 22.
>
> Traceback (most recent call last):
> File "/media/psf/Python/web2py/gluon/restricted.py", line 192, in restricted
> exec ccode in environment
> File
> "/Users/rosspeoples/Dropbox/Code/Python/web2py/applications/init/controllers/administration.py"
> <http://127.0.0.1:8001/admin/edit/init/controllers/administration.py>, line
> 650, in <module>
> File "/media/psf/Python/web2py/gluon/globals.py", line 137, in <lambda>
> self._caller = lambda f: f()
> File "/Users/rosspeoples/Dropbox/Code/Python/web2py/gluon/tools.py", line
> 2485, in f
> return action(*a, **b)
> File
> "/Users/rosspeoples/Dropbox/Code/Python/web2py/applications/init/controllers/administration.py"
> <http://127.0.0.1:8001/admin/edit/init/controllers/administration.py>, line
> 148, in security
> return update()
> File
> "/Users/rosspeoples/Dropbox/Code/Python/web2py/applications/init/controllers/administration.py"
> <http://127.0.0.1:8001/admin/edit/init/controllers/administration.py>, line
> 143, in update
> return user_form(user)
> File
> "/Users/rosspeoples/Dropbox/Code/Python/web2py/applications/init/controllers/administration.py"
> <http://127.0.0.1:8001/admin/edit/init/controllers/administration.py>, line
> 120, in user_form
> if form.accepts(request.vars, session):
> File "/media/psf/Python/web2py/gluon/sqlhtml.py", line 1203, in accepts
> self.table._db(self.table._id == self.record.id).update(**fields)
> File "/Users/rosspeoples/Dropbox/Code/Python/web2py/gluon/dal.py", line
> 5401, in update
> fields = self.db[tablename]._listify(update_fields,update=True)
> File "/Users/rosspeoples/Dropbox/Code/Python/web2py/gluon/dal.py", line
> 4677, in _listify
> raise SyntaxError, 'Field %s does not belong to the table' % name
> SyntaxError: Field is_administrator does not belong to the table
>
> And here is the controller that is adding the checkbox:
>
> form = SQLFORM(db.auth_user, user, showid=False)
> form[0].insert(-1, TR((
> TD(LABEL('Is Administrator',
> _for='auth_user_is_administrator')),
> TD(INPUT(_type='checkbox', _name='is_administrator',
> _id='auth_user_is_administrator'))
> )))
>
> form.vars.is_administrator = False
> if user:
> if auth.has_membership(user_id=user.id,
> role='Administrators'):
> form.vars.is_administrator = True
>
> if form.accepts(request.vars, session):
> admin_group =
> db(db.auth_group.role=='Administrators').select().first()
> db((db.auth_membership.user_id==user.id) &
> (db.auth_membership.group_id==admin_group.id)).delete()
>
> if form.vars.is_administrator:
> db.auth_membership.insert(group_id=admin_group.id,
> user_id=user.id)
>
> return 'OK'
>
> return dict(form=form)
>
> The thing that is driving me nuts is that I am doing exactly what the book
> says to do:
>
>
> http://web2py.com/book/default/chapter/07#Adding-extra-form-elements-to-SQLFORM
>
> Any thoughts? Thanks.
>