【问题标题】:Can I mark an HTML entity inside of a Django-outputted select box as safe?我可以将 Django 输出的选择框内的 HTML 实体标记为安全吗?
【发布时间】:2024-01-10 03:10:01
【问题描述】:

我的 Django 表单上有一个下拉框,其中包含 ® HTML 实体。有没有简单的方法让 Django 将其标记为安全?

这不起作用:

{{ form.myoptions.label_tag }}
{{ form.myoptions|safe }}

编辑:

我应该提到下拉框是从ForeignKey 字段生成的。

【问题讨论】:

    标签: django escaping html-entities


    【解决方案1】:

    你是对的 - 它不起作用......我想最简单的方法是将它标记为对 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 转换都不会被覆盖。

    【讨论】:

    • 有没有办法为从 ForeignKey 字段生成的下拉框执行此操作?
    • 哦等等,ModelChoiceField 使用查询集,而不是选择。让我深入研究它如何将 QS 转换为选择..
    • 是的,看起来您可以 1:手动构造字段的选择,或者 2:子类 ModelChoiceField 并将 label_from_instance 覆盖为 mark_safe
    最近更新 更多