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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:33:54