2017-07-21 11 views
1

私はジャンゴ-FSMのFSMKeyField as documentedを実装している:ジャンゴ有限状態マシンとFSMKeyField - 保存形式

class ClaimState(models.Model): 

    id = models.CharField(primary_key=True, max_length=50) 
    label = models.CharField(max_length=255) 

    def __str__(self): 
     return self.label 

を固定具を経由して状態を持つClaimStateモデルを埋めてきたし、別のモデルからFSMKeyFieldポインタを使用しています:

class Claim(models.Model): 
    state = FSMKeyField(ClaimState, default='new') 
    ... 

外部キーはDjangoのシェルから正常に動作します - 私が行うことができます。

s = ClaimState.objects.first() 
Claim.objects.create(state=s) 

問題ありません。しかし、私は、Djangoの管理者から、あるいは自分のフォームから請求を保存しようとすると、私はエラーを取得:

claim state instance with id <ClaimState: Rejected> does not exist. 

私はソースを表示した場合、私はドロップダウン値はPKのなので、それははっきりしていないことがわかりますなぜオブジェクト全体がIDであるかのように扱われているのです。

これが原因なのか、解決するには最良の方法は不明ですか?

enter image description here

答えて

1

私は今日、この同じ問題に遭遇した、モデルの管理のためのカスタムフォームを指定し、stateプロパティのクリーン機能をオーバーライドすることによってそれを解決しました。

class ClaimAdminForm(forms.ModelForm): 
    def clean_state(self): 
     return self.cleaned_data["state"].id 


@admin.register(Claim) 
class ClaimAdmin(admin.ModelAdmin): 
    form = ClaimAdminForm 
+0

感謝マット:あなたのケースでは

、これは次のようになります。うん、それは私の次のステップ(クリーンとフォームをオーバーライドする)になるだろうが、エラーは驚くべきものだったので、バグがあったか、何か間違っていたと思った。私はなぜそれがキーとして文字列を使用する必要があるか、またはラベルを隠す理由(myinstance.state.labelを実行することはできません)を理解しています。しかし、少なくともこれはフォームが機能するようになります。乾杯。 – shacker

関連する問題