【问题标题】:Custom widget not being marked safe自定义小部件未标记为安全
【发布时间】:2016-08-31 10:37:24
【问题描述】:

我正在创建一个自定义小部件以将选择字段显示为一排按钮。

到目前为止,我已经从 Django 源代码中复制了用于呈现单选字段的代码作为我的起点:

@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 = ''

我的问题是这段代码呈现了正确的 HTML,但它没有被标记为安全 - HTML 代码呈现到页面上。鉴于此代码本质上是直接从 Django 源代码复制而来,这非常令人惊讶。

缺少什么?如何使我的小部件类 html 安全?

【问题讨论】:

  • 您使用的是哪个版本的 Django?您是否从相应版本中复制了代码?
  • @Alasdair 1.9,我已经检查过了,没有任何区别
  • 尝试对ButtonFieldRenderer 类使用@html_safe 装饰器。

标签: django django-forms


【解决方案1】:

在你的渲染方法中更改字符串对我有用

  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
      )

【讨论】:

  • 在我的情况下,@html_sage@python_2_unicode_compatible 装饰器都不起作用
猜你喜欢
  • 2015-07-27
  • 1970-01-01
  • 2021-12-02
  • 2012-03-31
  • 1970-01-01
  • 1970-01-01
  • 2015-11-19
  • 2013-04-06
  • 1970-01-01
相关资源
最近更新 更多