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

Django 3.1:如何在模板中访问ModelChoiceField的对象属性

解决Django ModelChoiceField模板遍历访问模型属性的问题

这个问题我之前也碰到过,核心原因是你遍历form.available_spaces时拿到的不是直接的StorageSpace模型实例,而是Django表单字段生成的选项包装对象,所以直接访问.id、.price这些模型属性会失效。

正确的实现方式

你需要通过选项对象的.instance属性来获取对应的模型实例,然后就能访问所有模型字段了。同时别忘了给input设置正确的name属性,否则表单提交后无法正确绑定字段值。修改后的模板代码如下:

{% for space_option in form.available_spaces %}
  <label class="btn btn-outline-primary">
    <input 
      type="radio" 
      name="{{ form.available_spaces.name }}" 
      value="{{ space_option.instance.id }}" 
      data-storage-price="{{ space_option.instance.price }}"
      {% if space_option.is_selected %}checked{% endif %}
    >
    {{ space_option.instance.title }}
  </label>
{% endfor %}

关键细节解释

  1. space_option.instance:这是获取对应StorageSpace实例的关键,通过它你可以访问模型的所有属性(id、price、title等)。
  2. form.available_spaces.name:确保input的name和表单字段的name一致,这样Django才能正确处理提交的数据。
  3. {% if space_option.is_selected %}checked{% endif %}:可选添加,用来保持表单的选中状态(比如编辑场景)。

为什么之前的写法不行?

当你遍历form.available_spaces时,每个循环项是Django内部的ChoiceField选项对象(不是模型实例),它的.id属性其实是表单元素的HTML id,而不是模型的主键;直接访问.price、.title自然也找不到对应的属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 11:37:42