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.
>

Reply via email to