I am trying to provide a default value for an input textbox using
request.vars but am seeing some unusual behaviour.

Here is my controller:

    def search():
        keyword = ''
        if 'keyword' in request.vars:
            keyword = request.vars.keyword
        form=SQLFORM.factory(
                Field('keyword',
                    default=keyword,
                    )
                )
        if form.accepts(request.vars, session):
            response.flash = 'Submitted'
        return dict(form=form)


The view is basic.

    {{extend 'layout.html'}}
    {{=form}}


I am calling it like this:

    http://www.example.com/demo/default/search?keyword=web2py


When the page first displays, the input has the default as expected.
However on subsequent submits, the input value is changed to a list
with the keyword appended:

    Submit          Input value
    0               web2py
    1               ['web2py', 'web2py'].
    2               ['web2py', "['web2py', 'web2py']"]
    ...

This has something to do with my using the name 'keyword' for both the
field and the default value provided in the URL. If I use a different
name for the field it works normally.

I see something similar if I replicate the default value in the URL.
For example, this URL

    http://www.example.com/demo/default/search?keyword=web2py&keyword=web2py

sets the input default to  ['web2py', 'web2py']


Is this a bug or expected behaviour?

Is there a better way to permit a flexible default value for a field?

Reply via email to