Django Admin自定义ModelForm报错未知字段,如何实现货币选择?
解决Django Admin自定义ModelForm的FieldError问题
首先,咱们先搞清楚你遇到的FieldError的根源:你在Currencies_Form的Meta.fields里设置了Coins.arr,但这个列表里的是从API获取的货币ID,并不是Currencies模型中定义的字段——你的模型只有cryptoId和cryptoPrice两个字段,Django自然找不到那些“tron、rchain”之类的字段,所以报错了。
接下来咱们一步步修改代码,实现你要的“添加Currencies时显示货币单选列表,自动填充价格”的需求:
1. 修正CoinAPI.py中的货币列表生成逻辑
你之前用split()会把带空格的货币ID拆成多个元素(比如如果有个货币ID是"bitcoin cash",会被拆成["bitcoin", "cash"]),这会导致选项错误,改成直接append货币ID:
# CoinAPI.py import requests class Coins: def __init__(self): self.arr = [] self.hashTable = {} params = 100 try: data = requests.get(f'https://api.coinmarketcap.com/v1/ticker/?limit={params}').json() for obj in data: coin_id = obj.get('id') price_usd = obj.get('price_usd') if coin_id and price_usd: self.arr.append(coin_id) self.hashTable[coin_id] = price_usd except requests.exceptions.RequestException: # 处理API请求失败的情况,测试阶段可以暂时忽略 pass Coins = Coins()
2. 重写ModelForm,正确配置字段和自动填充逻辑
把cryptoId改成单选下拉框,并且在保存时自动从hashTable获取对应价格填充cryptoPrice:
# modelForm.py from django import forms from .models import Currencies from .CoinAPI import Coins class Currencies_Form(forms.ModelForm): # 生成单选下拉框的选项:(选项值, 显示文本) cryptoId = forms.ChoiceField( choices=[(coin, coin) for coin in Coins.arr], widget=forms.Select(), label="选择货币" ) class Meta: model = Currencies # 只指定模型中存在的字段! fields = ['cryptoId', 'cryptoPrice'] def save(self, commit=True): # 获取表单提交的选中货币 selected_coin = self.cleaned_data.get('cryptoId') # 调用父类的save方法先创建实例(不立即保存) instance = super().save(commit=False) # 从hashTable中获取对应价格 instance.cryptoPrice = Coins.hashTable.get(selected_coin, '') if commit: instance.save() return instance
3. 优化Admin配置,让价格字段只读
既然cryptoPrice是自动填充的,没必要让用户手动修改,在Admin里设置为只读:
# admin.py from django.contrib import admin from .models import Currencies from .modelForm import Currencies_Form class CurrenciesAdmin(admin.ModelAdmin): form = Currencies_Form # 设置cryptoPrice为只读字段 readonly_fields = ['cryptoPrice'] # 自定义添加页面的字段顺序 fields = ['cryptoId', 'cryptoPrice'] admin.site.register(Currencies, CurrenciesAdmin)
这样修改后,你在Admin点击添加Currencies时,就能看到一个包含所有货币的单选下拉框,选择后价格会自动填充,而且不会再出现FieldError了。
内容的提问来源于stack exchange,提问作者nexla
相关产品推荐
相关产品推荐

