You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django如何渲染表单字段时避免自动添加双引号?

解决Django表单字段渲染自动添加双引号导致与原始HTML不符的问题

我明白你现在遇到的痛点——从遗留PHP代码迁移到Django时,想用Django表单字段替换静态复选框,但渲染后的结果和原始HTML结构对不上,核心问题就是Django会自动给HTML属性加上双引号,破坏了你需要的遗留代码格式。下面给你两个实用的解决方案:

1. 手动拆解表单字段,自定义HTML结构(最直接的适配方式)

Django表单字段默认会生成完整的带属性双引号的input标签,但你可以拆解字段的核心属性,手动拼接成和原始HTML完全一致的结构。

首先,先确保你的表单类正确定义了这三个字段:

from django import forms

class PesquisarVisitasForm(forms.Form):
    maquinas_usadas = forms.BooleanField(required=False, label='Máquinas Usadas')
    vendas_efetuadas = forms.BooleanField(required=False, label='Vendas Efetuadas')
    vendas_perdidas = forms.BooleanField(required=False, label='Vendas Perdidas')

然后在模板里,不再直接使用{{ form_pesquisar_visitas.maquinas_usadas }}这种自动渲染方式,而是手动构建每个复选框的结构:

<button id="visitas-mes-opcoes" class="btn btn-default col-xs-12" type="button" data-toggle="popover" title="<label class='text-info'>Opções</label>" data-content=" 
<div id='opcoes-checkbox' class='checkbox'> 
  <label> 
    <input id='maquinas-usadas' class='checkbox-option' name='{{ form_pesquisar_visitas.maquinas_usadas.name }}' type='checkbox' value='1' {% if form_pesquisar_visitas.maquinas_usadas.value %}checked{% endif %}> 
    Máquinas Usadas
  </label> 
  <hr style='margin: 8px -10px 8px -30px; width: 180px;'/> 
  <label> 
    <input id='vendas-efetuadas' class='checkbox-option' name='{{ form_pesquisar_visitas.vendas_efetuadas.name }}' type='checkbox' value='1' {% if form_pesquisar_visitas.vendas_efetuadas.value %}checked{% endif %}> 
    Vendas Efetuadas
  </label> 
  <hr style='margin: 8px -10px 8px -30px; width: 180px;'/> 
  <label> 
    <input id='vendas-perdidas' class='checkbox-option' name='{{ form_pesquisar_visitas.vendas_perdidas.name }}' type='checkbox' value='1' {% if form_pesquisar_visitas.vendas_perdidas.value %}checked{% endif %}> 
    Vendas Perdidas
  </label> 
</div>"> 
<span class="glyphicon glyphicon-collapse-down"></span> 
</button>

这种方式既利用了Django表单的字段状态(比如是否被选中),又完全保留了原始HTML的结构和格式,不会出现Django自动添加的额外双引号。

2. 自定义Widget,批量复用遗留格式

如果这几个复选框需要在多个页面复用,可以自定义一个Widget,让它直接生成符合你需求的HTML:

from django.forms.widgets import CheckboxInput

class LegacyCheckboxWidget(CheckboxInput):
    def render(self, name, value, attrs=None):
        # 完全自定义input标签的生成逻辑,适配遗留代码格式
        final_attrs = self.build_attrs(attrs, type='checkbox', name=name)
        checked_attr = 'checked' if value else ''
        # 这里可以根据需要决定是否保留属性引号,完全匹配原始HTML
        return f"<input id='{final_attrs['id']}' class='checkbox-option' name='{name}' type='checkbox' value='1' {checked_attr}>"

然后在表单类里绑定这个Widget:

class PesquisarVisitasForm(forms.Form):
    maquinas_usadas = forms.BooleanField(
        required=False, 
        label='Máquinas Usadas',
        widget=LegacyCheckboxWidget(attrs={'id': 'maquinas-usadas'})
    )
    vendas_efetuadas = forms.BooleanField(
        required=False, 
        label='Vendas Efetuadas',
        widget=LegacyCheckboxWidget(attrs={'id': 'vendas-efetuadas'})
    )
    vendas_perdidas = forms.BooleanField(
        required=False, 
        label='Vendas Perdidas',
        widget=LegacyCheckboxWidget(attrs={'id': 'vendas-perdidas'})
    )

之后在模板里就可以直接使用{{ form_pesquisar_visitas.maquinas_usadas }},它会生成和原始PHP代码一致的复选框结构。

补充说明

Django自动添加双引号是因为它默认生成符合W3C规范的HTML——根据规范,HTML属性值必须用单引号或双引号包裹。你的遗留PHP代码可能没有严格遵循这个规范,但通过上面两种方法,你可以轻松适配遗留结构,同时享受Django表单带来的便捷性。

内容的提问来源于stack exchange,提问作者Vini.g.fer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:35:03