I don't know if this belongs on the dev board, but since it relates to
how the framework acts, I thought I'd give it a shot.  Basically, I am
curious as to the function of escape vs. conditional_escape, and the
decision to use the former in the forms.as_x functions...

As far as I can tell, escape escapes a string unconditionally, even if
it's marked as safe (though I don't understand why this should be).  I
am in a situation wherein I am trying to model a Dojo Widget as a
Django Widget, and need to make a javascript call with a string
argument.  I have mark_safe'd the call in question
attrs['some_element'] = mark_safe("value with unsafe characters") at
the widget level.  The problem is, when you get to the form rendering
level, even if a variable is marked safe, it gets escaped.

I've traced the execution and found the culprit to be the
django.forms.util.flatatt function.  That is:

from django import forms
from django.utils.safestring import mark_safe

class MyWidget(forms.TextInput):
    def __init__(self, *args, **kwargs):
        attrs = kwargs.setdefault('attrs', {})
        attrs['safe_string'] = "will o' the wisp"
        attrs['normal_string'] = "cat o' nine tails"
        super(MyWidget, self).__init__(*args, **kwargs)

w = MyWidget()
w.render("field_name", "")

#=> u'<input normal_string="cat o&#39; nine tails" type="text"
name="field_name" safe_string="will o&#39; the wisp" />'

You can see that both the unsafe and safe strings were escaped.  I
don't know if this is intentional or not, but it prevents me from
making something like:

<input type="text" onBlur="myFunction('string_arg')">

because it is always escaping my single-quotes.  Is this the desired
behavior?  Anyway, like I said, the culprit is:

# django.forms.util

def flatatt(attrs):
 
"""
    Convert a dictionary of attributes to a single
string.
    The returned string will contain a leading space followed by
key="value",
    XML-style pairs.  It is assumed that the keys do not need to be
XML-
escaped.
    If the passed dictionary is empty, then return an empty
string.
    """
    return u''.join([u' %s="%s"' % (k, escape(v)) for k, v in
attrs.items()])  # <-- right there, the escape(v) call... should this
be conditional_escape?



--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django developers" group.
To post to this group, send email to django-developers@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/django-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to