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

如何在Django表单的单选按钮label标签中嵌入图片

问题修复方案

1. 修复基础代码错误

修正models.py

原CHOICES定义格式错误,单元素元组必须加尾逗号,TRUE 改为Django合法布尔值 True:

class Asset(models.Model):
    ASSET_TYPE = (('Motor Vehicle','Motor Vehicle'),)
    asset = models.CharField(max_length=200, choices=ASSET_TYPE, null=True)

修正forms.py

首先导入模型层定义的ASSET_TYPE,initial参数要和选项实际值匹配,不能填写无效值0:

from .models import Asset

asset = forms.ChoiceField(
    choices=Asset.ASSET_TYPE, 
    initial='Motor Vehicle', 
    widget=forms.RadioSelect(attrs={'class':'form-check-inline'})
)

不要在widget上全局设置id,避免和渲染后的多选项id冲突。

2. 调整模板实现带图片的label效果

首先模板开头要加载静态文件标签,手动渲染时保证单选框id和label的for属性匹配,隐藏原生单选框,用label承载图片和文字实现点击交互:

{% load static %}
<div class="container asset">
  <div class="row">
    <div class="col">
      <div class="item">
        {{ form.asset.0.tag }}
        <label for="{{ form.asset.0.id_for_label }}">
          <img src="{% static 'Asset/Motor Vehicle.png' %}" alt="机动车">
          <strong>Motor Vehicle</strong>
        </label>
      </div>
    </div>
  </div>
</div>

上述写法可以保留Django表单自带的错误提示、默认值回填能力,无需手动硬编码表单属性。

3. 补充CSS实现选中样式

可以添加以下CSS实现选中label时的高亮效果,匹配预期设计:

/* 隐藏原生单选框 */
.item input[type="radio"] {
  display: none;
}
/* label默认样式 */
.item label {
  display: inline-block;
  padding: 10px;
  border: 2px solid #eee;
  border-radius: 8px;
  cursor: pointer;
}
/* 选中后label样式 */
.item input[type="radio"]:checked + label {
  border-color: #0d6efd;
  background-color: #f0f7ff;
}

内容的提问来源于stack exchange,提问作者Jin_Aussie_1545

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 09:54:02