Python Django有限状态机和FSMKeyField-保存表单

Python Django有限状态机和FSMKeyField-保存表单,python,django,Python,Django,我已实施django fsm的FSMKeyField: 并通过fixture使用状态填充ClaimState模型,am使用另一个模型的FSMKeyField指针: class Claim(models.Model): state = FSMKeyField(ClaimState, default='new') ... 外键在Django shell中工作正常-我可以做: s = ClaimState.objects.first() Claim.objects.create(st

我已实施django fsm的FSMKeyField:

并通过fixture使用状态填充ClaimState模型,am使用另一个模型的FSMKeyField指针:

class Claim(models.Model):
    state = FSMKeyField(ClaimState, default='new')
    ...
外键在Django shell中工作正常-我可以做:

s = ClaimState.objects.first()
Claim.objects.create(state=s)
没问题。但是,当我试图从Django管理员或从我自己的表单保存声明时,会出现以下错误:

claim state instance with id <ClaimState: Rejected> does not exist.
id为的声明状态实例不存在。 如果我查看source,我可以看到下拉值是PKs,所以不清楚为什么它将整个对象视为ID

不确定是什么导致了这一问题,也不确定解决这一问题的最佳方法是什么


我今天遇到了同样的问题,并通过为模型的管理员指定自定义表单并覆盖
state
属性的clean函数解决了这个问题

在您的情况下,这可能类似于:

类索赔信息(forms.ModelForm):
def清洁_状态(自身):
返回自清理的_数据[“状态”].id
@管理员登记(索赔)
类别管理员(admin.ModelAdmin):
表格=索赔信息

谢谢你,马特。是的,这将是我的下一步(覆盖clean和表单),但由于错误令人惊讶,我认为要么是有bug,要么是我做错了什么。我仍然不知道为什么它需要使用字符串作为键,或者为什么它隐藏标签(你不能做myinstance.state.label)。但至少这让表单起作用了。干杯
claim state instance with id <ClaimState: Rejected> does not exist.