2010-06-16 15 views
6

Nei modelli:modelli Django evitare duplicati

class Getdata(models.Model): 
    title = models.CharField(max_length=255) 
    state = models.CharField(max_length=2, choices=STATE, default="0") 
    name = models.ForeignKey(School) 
    created_by = models.ForeignKey(profile) 

    def __unicode__(self): 
     return self.id() 

In modelli:

<form> 
    <input type="submit" value="save the data" /> 
</form> 

Se l'utente fa clic sul pulsante Salva e il dato di cui sopra vengono salvati nella tabella, come evitare i duplicati , cioè se l'utente fa di nuovo clic sullo stesso pulsante di invio non ci dovrebbe essere un'altra voce per gli stessi valori. O è qualcosa che deve essere gestito in vista?

risposta

16

Se un campo individuo ha bisogno di essere unico, quindi si aggiunge solo unique=True:

class Getdata(models.Model): 
    title = models.CharField(max_length=255, unique=True) 
    state = models.CharField(max_length=2, choices=STATE, default="0") 
    name = models.ForeignKey(School) 
    created_by = models.ForeignKey(profile) 

Se si vuole una combinazione di campi per essere unico, è necessario unique_together:

class Getdata(models.Model): 
    title = models.CharField(max_length=255) 
    state = models.CharField(max_length=2, choices=STATE, default="0") 
    name = models.ForeignKey(School) 
    created_by = models.ForeignKey(profile) 
    class Meta: 
     unique_together = ["title", "state", "name"] 
+0

grazie ....................... – Hulk

+0

Anche quando getdata viene chiamato in visualizzazioni per il secondo esempio di default questo restituirà "titolo" , "stato" e "nome" è? – Hulk

+0

Quando si fa riferimento a un oggetto Getdata in una vista, si ottiene un oggetto GetData, con tutti i relativi campi. –

2

L'unique_together anche suggerito è il modo migliore, ma se ciò non è appropriato per le tue esigenze, puoi gestirlo nel metodo pulito della tua forma. es.

def clean(self): 
    try: 
     Getdata.objects.get(title=self.cleaned_data['title'], 
          state=self.cleaned_data['state'], 
          name=self.cleaned_data['name'], 
          created_by=self.cleaned_data['created_by']) 
     #if we get this far, we have an exact match for this form's data 
     raise forms.ValidationError("Exists already!") 
    except Getdata.DoesNotExist: 
     #because we didn't get a match 
     pass 

    return self.cleaned_data 
+0

Grazie, buona spiegazione .. – Hulk

+1

Ho anche visto, per il caso di invio multiplo, persone inserite in JavaScript che disabilitano il pulsante Invia quando viene fatto clic e il modulo è presentata. La soluzione migliore è probabilmente una combinazione di tutti questi. –

+0

Nel mio codice ho fatto la stessa cosa per ora ... ma questo era incoerente dagli altri..così dovevo sapere di questo .. La prossima volta posso usare un codice corretto invece di hack .. – Hulk

1

Penso che l'iniezione di un codice Jquery/JS per nascondere il pulsante di salvataggio sarebbe una buona idea.

Creare un file custom_validate.js come qui di seguito e posizionarlo nella directory statica (directory file statico)

if (!$) { 
    $ = django.jQuery; 
} 

$(document).ready(function() { 
    $("[name=_save]").click(function() { 
     $("[name=_save]").css("visibility", "hidden"); 
    }); 
}); 

E in admin.py, aggiungere il codice qui sotto.

class CustomDataForm(forms.ModelForm): 

    class Meta: 
     model = GetData 

class GetDataAdmin(admin.ModelAdmin): 
    # .... 
    ..... 
    form = CustomDataForm 

    class Media: 
     js = ('/static/custom_validate.js',)