使用Django ChoiceInpu在同一DOM级别呈现输入和标签标记

2024-04-19 01:27:10 发布

您现在位置:Python中文网/ 问答频道 /正文

默认的django ChoiceInput输出<input>标记中的<label>,我被要求在DOM中的同一级别输出它们,所以我编写了一个自定义的呈现器。你知道吗

该字段没有呈现安全的HTML,因此在浏览器中我只看到字段标签,然后是用于选择的原始HTML。你知道吗

我已经查看了我继承的ChoiceFieldRenderer,它的render函数返回一个mark_safe()字符串,那么为什么我的字段只呈现原始HTML呢?你知道吗

我的表单域是这样声明的

class SignupForm(forms.ModelForm):
    my_field = forms.NullBooleanField(
        widget=forms.widgets.RadioSelect(
            choices=FIELD_CHOICES,
            renderer=MyRadioFieldRenderer
        ),
        required=True,
        initial=True
    )

和我的习惯

class MyChoiceInput(forms.widgets.ChoiceInput):

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


class RadioChoiceInput(MyChoiceInput):
    input_type = 'radio'

    def __init__(self, *args, **kwargs):
        super(RadioChoiceInput, self).__init__(*args, **kwargs)
        self.value = force_text(self.value)


class MyRadioFieldRenderer(forms.widgets.ChoiceFieldRenderer):
    choice_input_class = RadioChoiceInput

Tags: selfnoneforinputvaluehtmlformswidgets