2016-05-05 10 views
0

Ich erstelle ein benutzerdefiniertes Widget, um ein Auswahlfeld als eine Reihe von Schaltflächen anzuzeigen.Benutzerdefiniertes Widget wird nicht als sicher markiert

Bisher habe ich für die Darstellung eines Funkauswahlfeld als mein Ausgangspunkt den Code aus dem Django Quelle kopiert:

@html_safe 
@python_2_unicode_compatible 
class ButtonInput(SubWidget): 

    input_type = 'radio' 

    def __init__(self, name, value, attrs, choice, index): 
    self.name = name 
    self.value = value 
    self.attrs = attrs 
    self.choice_value = force_text(choice[0]) 
    self.choice_label = force_text(choice[1]) 
    self.index = index 
    if 'id' in self.attrs: 
     self.attrs['id'] += "_%d" % self.index 
    self.value = force_text(self.value) 

    def __str__(self): 
     return self.render() 

    def render(self, name=None, value=None, attrs=None): 
     if self.id_for_label: 
      label_for = format_html(' for="{}"', self.id_for_label) 
     else: 
      label_for = '' 
     attrs = dict(self.attrs, **attrs) if attrs else self.attrs 
     return format_html(
      '<label{}>{} {}</label>', label_for, self.tag(attrs), self.choice_label 
    ) 

    def is_checked(self): 
     return self.value == self.choice_value 

    def tag(self, attrs=None): 
     attrs = attrs or self.attrs 
     final_attrs = dict(attrs, type=self.input_type, name=self.name, value=self.choice_value) 
     if self.is_checked(): 
      final_attrs['checked'] = 'checked' 
     return format_html('<input{} />', flatatt(final_attrs)) 

    @property 
    def id_for_label(self): 
     return self.attrs.get('id', '') 


class ButtonFieldRenderer(ChoiceFieldRenderer): 
    choice_input_class = ButtonInput 


class ButtonSelect(RendererMixin, Select): 
    renderer = ButtonFieldRenderer 
    _empty_value = '' 

Mein Problem ist, dass dieser Code die richtige HTML macht, aber es ist nicht Als sicher markiert - der HTML-Code wird auf der Seite gerendert. Da dieser Code im Wesentlichen direkt aus dem Django-Quellcode kopiert wird, ist dies sehr überraschend.

Was fehlt? Wie mache ich meine Widget-Klasse html-sicher?

+0

Welche Version von Django verwenden Sie? Haben Sie den Code von der entsprechenden Version kopiert? – Alasdair

+0

@Alasdair 1.9, und ich habe überprüft, gibt es keinen Unterschied – fredley

+0

Probieren Sie den '@ html_safe' Dekorator für die' ButtonFieldRenderer' Klasse. – Alasdair

Antwort

1

Ändern der Zeichenfolgen in der Methode machen für u für mich gearbeitet ‚‘

def render(self, name=None, value=None, attrs=None): 
     if self.id_for_label: 
      label_for = format_html(u' for="{}"', self.id_for_label) 
     else: 
      label_for = '' 
     attrs = dict(self.attrs, **attrs) if attrs else self.attrs 
     return format_html(
      u'<label{}>{} {}</label>', label_for, self.tag(attrs), self.choice_label 
    ) 
+0

Ist es nicht schon '@ python_2_unicode_compatible'? – valignatev

+0

in meinem Fall weder mit '@ html_sage' oder' @ python_2_unicode_compatible' Dekoratoren gearbeitet – felipemarin

Verwandte Themen