Django如何将Processors模型name值导入PC_Configuration下拉选项
问题解决方法
你遇到的报错是因为查询对象错误:你要拉取处理器名称应该操作Processors模型,而不是PC_Configuration模型,且PC_Configuration本身没有name字段,所以会触发字段不存在的报错。
下面是符合你需求的实现方案,动态拉取Processors的数据生成和原有硬编码格式一致的选项数组:
方案1:模型层直接配置(适配Django 3.0及以上版本)
Django 3.0开始支持choices参数传入可调用对象,会在每次字段被调用时动态生成选项,不会固化到迁移文件中,新增处理器数据后下拉选项会自动同步。
步骤1:定义选项生成函数
在你的models.py文件中加入如下函数:
def get_processor_choices(): # 先添加原有默认提示选项 choices = [('None', 'Wähle deinen Prozessor')] # 从Processors表查询数据,拼接为(存储值, 显示值)的格式 # 下方用id作为存储值,如果你需要直接存储name,可改为values_list('name', 'name') choices.extend(list(Processors.objects.values_list('id', 'name'))) return tuple(choices)
步骤2:修改PC_Configuration的processor字段
把原有硬编码的choices替换为上面的函数:
# 注意这里只传函数名,不要加括号执行 processor = models.CharField(max_length=25, choices=get_processor_choices, default='None')
方案2:表单层动态配置(兼容所有Django版本)
如果你用的是低于3.0的Django版本,可以在ModelForm中动态重写字段的选项:
from django import forms from .models import PC_Configuration, Processors class PCConfigurationForm(forms.ModelForm): processor = forms.ChoiceField(label='处理器') def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 每次初始化表单时拉取最新的处理器数据生成选项 self.fields['processor'].choices = [('None', 'Wähle deinen Prozessor')] + list(Processors.objects.values_list('id', 'name')) class Meta: model = PC_Configuration fields = '__all__'
补充说明
- 显卡、内存、操作系统、硬盘其他字段的动态配置可以参照处理器的逻辑,先创建对应的数据表模型,再写对应选项生成函数即可。
- 不要直接在模型的choices参数中调用函数(比如写
get_processor_choices()),否则只会在Django启动时生成一次选项,后续新增的配置数据无法同步,还会导致每次新增配置就需要重新生成迁移文件的问题。
内容的提问来源于stack exchange,提问作者Cptain_Whitebeard
相关产品推荐
相关产品推荐

