The problem might be in the code you stripped out. What does the code 
around line 138 look like?

It appears you are referencing "items" somewhere where it does not exist.

What does the code look like that processes the form? Do you have a 
redirect after 


For the email field, you might need to override the default "requires":

table_user.email.requires = [IS_IN_DB(self.db, table_user.email,
            error_message=self.messages.invalid_email)]

with

auth.settings.table_user.email.requires = None

Alternatively, you could set the email address yourself before processing 
the form if you have it:

form.vars.email = 'j...@yahoo.com'
if form.process().accepted:
   ...



On Thursday, November 15, 2012 7:42:16 PM UTC-8, Florian Letsch wrote:
>
> I have some custom requirements for registration, but I still want to use 
> auth.register() with a custom form view to rely on web2py's form validation.
>
> Background: I have a table of allowed email addresses with a generated 
> secret hash. (kind of like an invitation only registration). When you 
> access the secret invite link I look up the secret hash in the database and 
> want to use the auth.register() form  without the email field so I can set 
> the user's email to the one I already have.
>
> I have come across 2 problems:
> 1. When my custom form doesn't include an email field, the form does not 
> seem to be processed and just redirects to itself. (see comment in view 
> below)
> 2. When I set the email field to be not writable, the registration fails 
> and I get a ticket:
>  Traceback (most recent call last):
>  File "/Users/flo/Applications/web2py/gluon/restricted.py", line 205, 
> inrestricted
>  exec ccode in environment
>  File 
> "/Users/flo/Applications/web2py/applications/main/controllers/signup.py"<http://127.0.0.1:8000/admin/default/edit/main/controllers/signup.py>
> , line 138, in <module>
>  File "/Users/flo/Applications/web2py/gluon/globals.py", line 173, in 
> <lambda>
>  self._caller = lambda f: f()
>  File 
> "/Users/flo/Applications/web2py/applications/main/controllers/signup.py"<http://127.0.0.1:8000/admin/default/edit/main/controllers/signup.py>
> , line 62, in complete
>  form = auth.register(onaccept=on_accept)
>  File "/Users/flo/Applications/web2py/gluon/tools.py", line 1959, in 
> register
>  user = Storage(table_user._filter_fields(user, id=True))
>  File "/Users/flo/Applications/web2py/gluon/dal.py", line 6683, 
> in_filter_fields
>  return dict([(k, v) for (k, v) in record.items() if k
> AttributeError: 'NoneType' object has no attribute 'items'
>
> Here is the code that I think is relevant for this:
>
> Inside my controller:
> signup_data = 
> db(db.signup.signup_key==signup_key).select(db.signup.ALL).first()
> def on_accept(form):
>     # does a whole bunch of setting up additional db entries
>     pass # stripped out for the example
> auth.settings.table_user.email.default = signup_data.email
> auth.settings.table_user.email.writable = False # causes error
> form = auth.register(onaccept=on_accept) # line 62 (see error log)
>
> Inside my view:
> {{=form.custom.begin }}
> <div style="display: none;">
>   {{ # removing this field from markup causes the form submission to 
> fail. :/}}
>   {{=form.custom.widget.email }} 
> </div>
> {{=form.custom.widget.first_name }}
> ... all the other widgets ...
> {{=form.custom.end}}
>
>
>

-- 



Reply via email to