Actually, I think it would also work if you simply avoided assigning to 
form.vars after form submission. So, instead of:
 
form.vars.is_administrator = user and auth.has_membership(user_id=user.id, 
role='Administrators') 
 
do:
 
if not request.vars:
    form.vars.is_administrator = user and auth.has_membership(user_id=
user.id, role='Administrators')
 
 
That way, you will assign to form.vars when the form is first created, but 
you will not assign to it once the form has been submitted, which is 
probably what you want anyway.
 
Anthony
 

On Friday, June 17, 2011 4:16:34 PM UTC-4, Anthony wrote:

> 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