Custom RadioSelect renderer doesn't output safe HTML

The default django radio button renderer outputs the <input> within the <label> tag & I've been asked to output them at the same level in the DOM so have written a custom renderer.

The trouble is, the field isn't rendering with safe HTML so in the browser I'm just seeing the field label, then the raw html for the choices.

My form field is declared as so;

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

And my custom renderer;

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

I've looked over the ChoiceFieldRenderer which I'm inheriting & it's render function returns a mark_safe() string, so why does my field just render raw HTML?