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?
Welche Version von Django verwenden Sie? Haben Sie den Code von der entsprechenden Version kopiert? – Alasdair
@Alasdair 1.9, und ich habe überprüft, gibt es keinen Unterschied – fredley
Probieren Sie den '@ html_safe' Dekorator für die' ButtonFieldRenderer' Klasse. – Alasdair