Hi,
I found a workaround to the problem. I need to assign the id "login" to the
form so that certain CSS and JS can be applied to the form elements. Since
I was unable to assign id to the form, I assigned the id "login" to the
table element. The login is now working.
But another problem has surfaced. Now whenever I enter correct the
credentials I am successfully able to login but whenever I enter
false credentials, I am unable to see any form errors.
How invalid login is handled by Auth ?
I want to show the error "Email/Password not matching" below my form. How
could I do that ?
My controller code is :
def index():
login_form = auth.login()
# Configure form fields
login_form.custom.widget.email['_value']='Email'
login_form.custom.widget.email['_data']='Email'
login_form.custom.widget.password['_value']='Password'
login_form.custom.widget.password['_data']='Password'
login_form.custom.submit['_value']='Login'
# Configure form properties
# login_form['_id']='login'
if login_form.errors:
login_form.errors.email='Email/Password does not match'
return dict(login_form=login_form)
In the view I have :
{{=login_form.custom.begin}}
<table id="login">
<tr>
<td
colspan='2'>{{=login_form.custom.widget.email}}</td>
</tr>
<tr>
<td
colspan='2'>{{=login_form.custom.widget.password}}</td>
</tr>
<tr>
<td><a href="#" id="flipToRecover"
class="flipLink">Forgot Password?</a></td>
<td>{{=login_form.custom.submit}}</td>
</tr>
<tr></tr>
<tr class="error">
<td colspan="2"><!-- Show error here --></td>
</tr>
</table>
{{=login_form.custom.end}}
On Tuesday, March 13, 2012 12:25:53 AM UTC+5:30, Anthony wrote:
>
> Hmm, works when I try it. Can you show the full controller code you have
> now?
>
> On Monday, March 12, 2012 2:46:57 PM UTC-4, Sushant Taneja wrote:
>>
>> The rendered form is as:
>>
>> <form action="" enctype="multipart/form-data" method="post">
>> ...
>> </form>
>>
>> It has no attribute id.
>>
>> On Tuesday, March 13, 2012 12:05:02 AM UTC+5:30, Anthony wrote:
>>>
>>> What's not working? When you view the HTML code of the rendered page in
>>> the browser, is the id not there, or is it just that some client-side CSS
>>> or JS isn't working as expected? If the latter, the problem could be that
>>> you have put the form beginning and ending code inside the <table></table>
>>> tags rather than outside, where they belong. Should be:
>>>
>>> {{=login_form.custom.begin}}
>>> <table>
>>> [snip]
>>> </table>
>>> {{=login_form.custom.end}}
>>>
>>> Anthony
>>>
>>> On Monday, March 12, 2012 2:07:20 PM UTC-4, Sushant Taneja wrote:
>>>>
>>>> Hi,
>>>>
>>>> I tried both but none seems to be working. Here's my view code:
>>>>
>>>> <div id="formContainer">
>>>> <table>
>>>> {{=login_form.custom.begin}}
>>>> <tr>
>>>> <td
>>>> colspan='2'>{{=login_form.custom.widget.email}}</td>
>>>> </tr>
>>>> <tr>
>>>> <td
>>>> colspan='2'>{{=login_form.custom.widget.password}}</td>
>>>> </tr>
>>>> <tr>
>>>> <td><a href="#" id="flipToRecover"
>>>> class="flipLink">Forgot Password?</a></td>
>>>> <td>{{=login_form.custom.submit}}</td>
>>>> </tr>
>>>> {{=login_form.custom.end}}
>>>> </table>
>>>>
>>>> Please suggest.
>>>>
>>>> On Monday, March 12, 2012 11:32:04 PM UTC+5:30, Anthony wrote:
>>>>>
>>>>> That should work. Can you show the view code? Also, note you can just
>>>>> do:
>>>>>
>>>>> login_form['_id'] = 'login'
>>>>>
>>>>> Anthony
>>>>>
>>>>> On Monday, March 12, 2012 1:19:45 PM UTC-4, Sushant Taneja wrote:
>>>>>>
>>>>>> I tried customizing the form. I have to set the id of the form
>>>>>> element to login.
>>>>>> To achieve the above I used the following statement in controller:
>>>>>>
>>>>>> login_form = auth.login()
>>>>>>
>>>>>> # Configure form properties
>>>>>> login_form.attributes['_id']='login'
>>>>>>
>>>>>> But it's not working. The generated form does not contain any id
>>>>>> attribute.
>>>>>> Is there another way to do it ?
>>>>>>
>>>>>> Thanks,
>>>>>> Sushant
>>>>>>
>>>>>> On Monday, March 12, 2012 8:01:33 PM UTC+5:30, Sushant Taneja wrote:
>>>>>>>
>>>>>>> Thanks for an explanatory answer.
>>>>>>> I will try this out.
>>>>>>>
>>>>>>> On Monday, March 12, 2012 7:49:28 PM UTC+5:30, Anthony wrote:
>>>>>>>>
>>>>>>>> def index():
>>>>>>>>>
>>>>>>>>> login_form = auth.login()
>>>>>>>>> if login_form.process(session=None,formname='login').accepted:
>>>>>>>>> pass
>>>>>>>>> elif login_form.errors:
>>>>>>>>> response.write(request.vars)
>>>>>>>>> return dict()
>>>>>>>>>
>>>>>>>>> to display the form I have used the SQLForm in HTML technique as
>>>>>>>>> mentioned in the web2py book
>>>>>>>>>
>>>>>>>>> Whenever user enters the correct email and password. auth_event
>>>>>>>>> registers a login event with the description *User 1 Logged In*.
>>>>>>>>> The next property redirects the URL to /user/profile but auth.user
>>>>>>>>> object is *None.*
>>>>>>>>>
>>>>>>>>
>>>>>>>> auth.login() handles it's own form processing, and it uses the
>>>>>>>> session when calling form.accepts (which adds a hidden _formkey field
>>>>>>>> to
>>>>>>>> the form, which must be present upon form submission). In your code,
>>>>>>>> you do
>>>>>>>> not return the form object to the view, which means your view cannot
>>>>>>>> include the hidden _formkey field, which is therefore not submitted
>>>>>>>> with
>>>>>>>> the form. So, when the form is submitted, the form.accepts in
>>>>>>>> auth.login()
>>>>>>>> fails, which means the user object is never stored in
>>>>>>>> session.auth.user --
>>>>>>>> hence, auth.user is None. The reason the login submission is
>>>>>>>> successful is
>>>>>>>> that your index() function then does its own processing of the login
>>>>>>>> form,
>>>>>>>> which is successful -- but your explicit call to login_form.process()
>>>>>>>> does
>>>>>>>> not do anything to set auth.user, so it is never set.
>>>>>>>>
>>>>>>>> In short, you should not be doing your own processing of the login
>>>>>>>> form -- let auth.login() handle that. And if you want to customize the
>>>>>>>> form
>>>>>>>> display in the view, you still have to return the form to the view so
>>>>>>>> you
>>>>>>>> can include the hidden _formkey and _formname fields in the form (you
>>>>>>>> can
>>>>>>>> use form.custom.end to do that).
>>>>>>>>
>>>>>>>> Anthony
>>>>>>>>
>>>>>>>
>>>>> On Monday, March 12, 2012 1:19:45 PM UTC-4, Sushant Taneja wrote:
>>>>>>
>>>>>> I tried customizing the form. I have to set the id of the form
>>>>>> element to login.
>>>>>> To achieve the above I used the following statement in controller:
>>>>>>
>>>>>> login_form = auth.login()
>>>>>>
>>>>>> # Configure form properties
>>>>>> login_form.attributes['_id']='login'
>>>>>>
>>>>>> But it's not working. The generated form does not contain any id
>>>>>> attribute.
>>>>>> Is there another way to do it ?
>>>>>>
>>>>>> Thanks,
>>>>>> Sushant
>>>>>>
>>>>>> On Monday, March 12, 2012 8:01:33 PM UTC+5:30, Sushant Taneja wrote:
>>>>>>>
>>>>>>> Thanks for an explanatory answer.
>>>>>>> I will try this out.
>>>>>>>
>>>>>>> On Monday, March 12, 2012 7:49:28 PM UTC+5:30, Anthony wrote:
>>>>>>>>
>>>>>>>> def index():
>>>>>>>>>
>>>>>>>>> login_form = auth.login()
>>>>>>>>> if login_form.process(session=None,formname='login').accepted:
>>>>>>>>> pass
>>>>>>>>> elif login_form.errors:
>>>>>>>>> response.write(request.vars)
>>>>>>>>> return dict()
>>>>>>>>>
>>>>>>>>> to display the form I have used the SQLForm in HTML technique as
>>>>>>>>> mentioned in the web2py book
>>>>>>>>>
>>>>>>>>> Whenever user enters the correct email and password. auth_event
>>>>>>>>> registers a login event with the description *User 1 Logged In*.
>>>>>>>>> The next property redirects the URL to /user/profile but auth.user
>>>>>>>>> object is *None.*
>>>>>>>>>
>>>>>>>>
>>>>>>>> auth.login() handles it's own form processing, and it uses the
>>>>>>>> session when calling form.accepts (which adds a hidden _formkey field
>>>>>>>> to
>>>>>>>> the form, which must be present upon form submission). In your code,
>>>>>>>> you do
>>>>>>>> not return the form object to the view, which means your view cannot
>>>>>>>> include the hidden _formkey field, which is therefore not submitted
>>>>>>>> with
>>>>>>>> the form. So, when the form is submitted, the form.accepts in
>>>>>>>> auth.login()
>>>>>>>> fails, which means the user object is never stored in
>>>>>>>> session.auth.user --
>>>>>>>> hence, auth.user is None. The reason the login submission is
>>>>>>>> successful is
>>>>>>>> that your index() function then does its own processing of the login
>>>>>>>> form,
>>>>>>>> which is successful -- but your explicit call to login_form.process()
>>>>>>>> does
>>>>>>>> not do anything to set auth.user, so it is never set.
>>>>>>>>
>>>>>>>> In short, you should not be doing your own processing of the login
>>>>>>>> form -- let auth.login() handle that. And if you want to customize the
>>>>>>>> form
>>>>>>>> display in the view, you still have to return the form to the view so
>>>>>>>> you
>>>>>>>> can include the hidden _formkey and _formname fields in the form (you
>>>>>>>> can
>>>>>>>> use form.custom.end to do that).
>>>>>>>>
>>>>>>>> Anthony
>>>>>>>>
>>>>>>>