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

Reply via email to