2010-01-22 13 views
7

Ho un modulo in cui convalidare nel metodo clean se esiste già un oggetto ProjectMembership, che ha gli stessi valori per progetto e membro . Ciò è dovuto al fatto che nel modello ProjectMembership ho definito un vincolo unique_together per project e member. Questo funziona davvero bene.django - come verificare in un metodo pulito di un modulo se si tratta di un inserto o di un aggiornamento

class ProjectMembershipForm(forms.ModelForm): 

    project = forms.ModelChoiceField(Project.objects, widget=HiddenInput()) 

    class Meta: 
     model = ProjectMembership 

    def clean(self): 
     cleaned_data = self.cleaned_data 

     project = cleaned_data.get("project") 
     member = cleaned_data.get("member") 

     print ProjectMembership.objects.filter(project=project, member=member).count() 
     if ProjectMembership.objects.filter(project=project, member=member).count() > 0: 
      del cleaned_data["project"] 
      del cleaned_data["member"] 
      raise forms.ValidationError('The user "%s" is already part of the project team for project "%s".' % (member, project)) 
     return cleaned_data 

Ma ora mi sto chiedendo come posso giudicare nel metodo pulito se l'utente tenta di creare una nuova relazione o aggiornare una relazione. Perché con questo metodo pulito non è possibile fare un aggiornamento, poiché restituisce il messaggio di errore che la voce esiste già.

+0

Hai trovato una soluzione a questo? Sto cercando di fare lo stesso da solo, ma non riesco a trovare una soluzione. – espenhogbakk

+0

No non ha trovato una soluzione. Ora uso solo due moduli, uno per l'aggiornamento e uno per l'inserimento. Nel modulo di aggiornamento è necessario disabilitare i campi univoci insieme per assicurarsi di non violare questo vincolo. Questo approccio ha lo svantaggio che non è possibile aggiornare i campi che hanno i vincoli unici univoci. –

risposta

5

Si può provare a cambiare questo:

if ProjectMembership.objects.filter(project=project, member=member).count() > 0: 

a qualcosa di simile:

if ProjectMembership.objects.filter(project=project, member=member).exclude(pk=self.instance.id).count() > 0: 

in realtà è necessario verificare se self.instance non è None prima di usarlo in esclude, ma spero che questo un piccolo frammento ti ha dato un'idea di come puoi portare a termine il tuo compito senza duplicare le forme.

16

Prova questo:

if self.instance.pk: 
    update_procedure() 
else: 
    insert_procedure() 
Problemi correlati