I tryed to simpllfy my code to post it here, so in a controller:

def simpletest():
    #table definition
    db.define_table('t_simple_test',
    Field('f_form', type='text',
          label=T('Form'),
          comment=T('Write anything here')))
    #form definition
    questionid = 0
    if request.args(0):
        questionid = request.args(0)
        record = db.t_simple_test(questionid)
        if not record:
            session.flash = T("Unknown form %s") % questionid
            redirect(URL('index'))
        logger.info("Editing form %s" % questionid)
        form = SQLFORM(db.t_simple_test, record, deletable=True)
    else:
        logger.info("Editing new form")
        form = SQLFORM(db.t_simple_test)
    if form.accepts(request.vars, session):
        response.flash = T("Form saved.")
        if not questionid:#first save
            session.flash = response.flash
            redirect(URL('simpletest',args=[form.vars.id]))
    elif form.errors:
        response.flash = T("Form in error.")
    return dict(form=form,questionid=questionid)

(I know I should avoid to define a table in the controller, but I moved the 
definition here in order not to mess with the rest of my code.)
But using the form generated by this controller, I cannot reproduce my 
problem. :-(

In my other controller functions where I reproduce the problem, I just do 
some other things after the form.accepts() (because I added more things in 
my form in the view), but I do not change the content of the submitted form.
Even in the views I do not check nor rewrite the content of standard form 
fields... I will investigate more and replace escaped characters by the 
non-escaped ones for the moment.

I know the content written to a page is escaped, so I use XML(form) to keep 
HTML content. But only selected people can write such content, general 
users only see the displayed HTML :-)

Thank you Anthony !

Le vendredi 25 mai 2012 15:11:33 UTC+2, Anthony a écrit :
>
> Can you post some code? Using your own SQLFORM will produce the same 
> results as appadmin when creating and editing a record (appadmin also uses 
> SQLFORM).
>
> Note, by default, any content you write directly to the page in the view 
> is escaped, so any HTML tags will be escaped and displayed as literals 
> rather than interpreted as HTML. To prevent content from being escaped, you 
> have to wrap it in XML() (see 
> http://web2py.com/books/default/chapter/29/5#XML). Be careful about that 
> -- if you fail to escape content submitted by general users, you'll have a 
> cross-site scripting vulnerability (
> http://en.wikipedia.org/wiki/Cross-site_scripting).
>
> Anthony
>
> On Friday, May 25, 2012 4:35:30 AM UTC-4, Cédric Mayer wrote:
>>
>> Hello !
>> I have a table with "text" fields:
>>     Field('f_comments', type='text',
>>           label=T('Comment')),
>> or even:
>>     Field('f_form', type='text',
>>           label=T('Form'), comment=T('Please write HTML here')),
>> Using appadmin interface, if I use an apostrophe " ' " inside the 
>> textarea fields and submit the record form, the apostrophe saved, and if I 
>> display the appadmin form for the same record again, they are displayed 
>> inside the textarea fields.
>>
>> But creating my own form:
>>     form = SQLFORM(db.t_question, record, deletable=True)
>> apostrophes " ' " do not appear anymore.
>>
>> I did some copy-paste of what was inside my own textarea to an 
>> hexadecimal editor, and the apostrophe are replaced with the # 27 (hexa 1B) 
>> character in the case of my own form.
>>
>> If I save the form as-is, this 1B character is saved too, and so the 
>> apostrophe disappears also if I look to the record from the appadmin 
>> interface.
>>
>> It is really anoying as I use the content of the fields as pure HTML 
>> afterwards : not having apostrophes leads to errors if I try to have some 
>> Javascript in those fields.
>>
>> 1) What is the difference between the form generated in appadmin, and the 
>> one generated by SQLFORM ?
>> 2) Is there a way not to escape " ' " in text fields ?
>>
>

Reply via email to