2017-07-21 4 views
1

ich django-FSMs FSMKeyField as documented umgesetzt haben:Django Finite State Machine und FSMKeyField - Sparformen

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 

und haben das ClaimState Modell mit den Staaten über Befestigung bevölkert, und bin mit einem FSMKeyField Zeiger von einem anderen Modell:

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

Der Fremdschlüssel funktioniert gut von einem Shell-Django - ich kann tun:

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

Kein Problem. Aber wenn ich versuche, eine Forderung aus dem Django Admin zu speichern oder aus meiner eigenen Form, erhalte ich die Fehlermeldung:

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

Wenn ich Quelle zu sehen, kann ich sehen, dass die Drop-Down-Werte die PKs sind, so ist es nicht klar, Warum behandelt es das ganze Objekt als wäre es die ID?

Nicht sicher, was diese oder die beste Lösung verursacht?

enter image description here

Antwort

1

Ich lief in diesem heute gleiche Problem und es gelöst durch ein benutzerdefiniertes Formular für das Modell der admin und das Überschreiben der Clean-Funktion für die state Eigenschaft angeben.

In Ihrem Fall könnte dies etwas wie folgt aussehen:

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


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

Dank Matt. Ja, das würde mein nächster Schritt sein (Überschreiben sauber und die Form), aber da der Fehler überraschend war, dachte ich entweder, dass es einen Fehler gab oder ich etwas falsch gemacht hatte. Immer noch nicht sicher, ich verstehe, warum es Zeichenfolgen als Schlüssel erfordert, oder warum es Kennsätze verbirgt (Sie können myinstance.state.label nicht tun). Aber zumindest das bringt Formen zum Laufen. Prost. – shacker

Verwandte Themen