将Django 1.8自定义字段渲染器迁移至Django 3.2的方法咨询
Django 3.2迁移自定义Radio渲染器解决方案
Django 3.2已经彻底移除了旧版的renderer参数,现在要实现Bootstrap风格的单选框渲染,推荐用自定义Widget模板或者模板手动渲染两种方式,具体如下:
方法一:自定义RadioSelect Widget(推荐)
这种方式能把渲染逻辑封装起来,复用性强,步骤如下:
创建自定义Widget类
继承RadioSelect,指定自定义模板路径:from django.forms.widgets import RadioSelect class BSRadioSelect(RadioSelect): # 指向你项目中的自定义模板文件 template_name = 'widgets/bs_radio.html' # 可选:如果需要单独定义每个选项的模板 option_template_name = 'widgets/bs_radio_option.html'修改表单代码
把原来的RadioSelect(renderer=...)替换成自定义的BSRadioSelect:class SomeEditForm(forms.ModelForm): job_uuid = forms.CharField(widget=forms.HiddenInput()) class Meta: model = Job fields = ('status',) widgets = {'status': BSRadioSelect()}编写自定义模板
在你的app目录下创建templates/widgets/bs_radio.html,按照Bootstrap的结构编写渲染逻辑,比如:<div class="radio-group"> {% for choice in widget.options %} <div class="form-check"> <input type="radio" name="{{ widget.name }}" value="{{ choice.value }}" id="{{ widget.attrs.id }}_{{ forloop.counter }}" {% if choice.selected %}checked{% endif %} class="form-check-input" {% for attr_name, attr_value in widget.attrs.items %} {% if attr_name != 'id' %} {{ attr_name }}="{{ attr_value }}"{% endif %} {% endfor %}> <label class="form-check-label" for="{{ widget.attrs.id }}_{{ forloop.counter }}"> {{ choice.label }} </label> </div> {% endfor %} </div>如果原来的
BSRadioFieldRenderer有特殊逻辑(比如额外的样式、数据处理),可以在自定义Widget的get_context方法里补充:class BSRadioSelect(RadioSelect): template_name = 'widgets/bs_radio.html' def get_context(self, name, value, attrs): context = super().get_context(name, value, attrs) # 这里可以修改选项的上下文数据,比如添加自定义属性 for option in context['widget']['options']: option['attrs']['data-custom'] = option['value'] return context
方法二:模板中手动渲染字段
如果只需要在个别模板里定制渲染,直接在模板里循环选项即可,无需修改Widget:
<!-- 在表单模板中 --> {% for choice in form.status %} <div class="form-check"> {{ choice.tag }} <label class="form-check-label" for="{{ choice.id_for_label }}"> {{ choice.choice_label }} </label> </div> {% endfor %}
关键说明
Django从1.11开始就弃用了renderer参数,3.2完全移除后,官方推荐用模板驱动的Widget渲染替代旧的Renderer类,这种方式更灵活,也符合Django后续版本的设计方向。
内容的提问来源于stack exchange,提问作者Jingo
相关产品推荐
相关产品推荐

