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

Django结合Gspread做表单选项报choices格式错误如何解决?

问题原因
  • 你写的_generate_choices函数没有返回值,调用后传入ChoiceField的choices参数的是None,不符合Django的字段要求,直接触发E005报错。
  • 选项生成逻辑有bug:循环生成选项时temp_list没有每次重置,会导致生成的元组长度超过2,不符合(实际存储值, 前台展示名)的二元组格式要求。
  • 潜在问题:当前把选项生成逻辑放在表单类属性定义阶段,只会在Django项目启动时执行一次,后续谷歌表格内的路径更新后,表单选项不会自动同步。
修复方案

你不需要修改模型代码,动态选择项不需要在模型层配置choices参数,只需要调整表单逻辑即可,修复后的表单代码如下:

from django import forms
from .models import Robot
import gspread
from oauth2client.service_account import ServiceAccountCredentials

class RobotForm(forms.ModelForm):
    @staticmethod
    def _generate_choices():
        scope = ["REDACTED",'REDACTED',"REDACTED","REDACTED"]
        creds = ServiceAccountCredentials.from_json_keyfile_name("dashboard/Files/creds.json", scope)
        client = gspread.authorize(creds)
        sheet = client.open("tutorial").sheet1
        path_name_fetch =  sheet.col_values(1)
        # 直接用set去重,简化逻辑
        unique_paths = list(set(path_name_fetch))
        # 直接生成符合要求的二元组列表
        return [(path, path) for path in unique_paths]
    
    path_choices = forms.ChoiceField(choices=[])
    
    class Meta:
        model = Robot
        fields = ['path_choices']
    
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # 每次实例化表单时拉取最新选项,保证数据同步
        self.fields['path_choices'].choices = self._generate_choices()
优化建议

如果路径更新频率不高,可以增加缓存逻辑减少网络请求开销:用Django自带的缓存框架存储拉取到的路径列表,设置合适的过期时间(比如10分钟),避免每次实例化表单都请求谷歌表格接口。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 05:12:03