【发布时间】:2024-01-10 03:10:01
【问题描述】:
我的 Django 表单上有一个下拉框,其中包含 ® HTML 实体。有没有简单的方法让 Django 将其标记为安全?
这不起作用:
{{ form.myoptions.label_tag }}
{{ form.myoptions|safe }}
编辑:
我应该提到下拉框是从ForeignKey 字段生成的。
【问题讨论】:
标签: django escaping html-entities
我的 Django 表单上有一个下拉框,其中包含 ® HTML 实体。有没有简单的方法让 Django 将其标记为安全?
这不起作用:
{{ form.myoptions.label_tag }}
{{ form.myoptions|safe }}
编辑:
我应该提到下拉框是从ForeignKey 字段生成的。
【问题讨论】:
标签: django escaping html-entities
你是对的 - 它不起作用......我想最简单的方法是将它标记为对 python 安全。
from django.utils.safestring import mark_safe
MY_CHOICES = [
('foo', mark_safe('& foo')),
('bar', 'bar'),
]
根据来源,您可以手动定义ModelChoiceField.choices,也可以编写一个新字段并覆盖label_from_instance。
class MyModelForm(forms.ModelForm):
class Meta:
model = Foo
def __init__(self, *args, **kwargs):
super(MyModelForm, self).__init__(*args, **kwargs)
self.fields['foo'].choices = ((foo.id, mark_safe(foo.bar)) for foo in Foo.objects.all())
class SafeModelChoiceField(ModelChoiceField):
def label_from_instance(self, obj):
return mark_safe(obj)
我想我更喜欢自己构建选择,这样任何其他神奇的ModelFormfield -> form field 转换都不会被覆盖。
【讨论】:
ModelChoiceField 使用查询集,而不是选择。让我深入研究它如何将 QS 转换为选择..
ModelChoiceField 并将 label_from_instance 覆盖为 mark_safe。