6

dans les modèles:modèles Django éviter les doublons

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() 

Dans les modèles:

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

Si l'utilisateur clique sur le bouton d'enregistrement et les données ci-dessus sont enregistrées dans la table, comment éviter les doublons , c'est-à-dire que si l'utilisateur clique de nouveau sur le même bouton d'envoi, il ne devrait pas y avoir d'autre entrée pour les mêmes valeurs. Ou est-ce quelque chose qui doit être manipulé dans les vues?

Répondre

16

Si un champ individuel doit être unique, vous venez d'ajouter 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) 

Si vous voulez une combinaison de champs pour être unique, vous avez besoin 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

merci ....................... – Hulk

+0

De même lorsque getdata est appelée dans les vues pour le second exemple par défaut cela retournera "title" , "état" et "nom" est-ce? – Hulk

+0

Lorsque vous référencez un objet Getdata dans une vue, vous obtenez un objet GetData avec tous ses champs. –

2

Le unique_together Le meilleur moyen est également suggéré, mais si ce n'est pas approprié pour vos besoins, vous pouvez le gérer dans la méthode propre de votre formulaire. par exemple

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

Merci ,, bonne explication .. – Hulk

+1

J'ai également vu, pour le cas de soumettre plusieurs fois, les gens mis en JavaScript qui désactive le bouton Soumettre quand il est cliqué et le formulaire est soumis. La meilleure solution est probablement une combinaison de tous ces éléments. –

+0

Dans mon code j'ai fait la même chose pour le moment ... mais c'était inconsistant des autres ... donc j'ai dû savoir à ce sujet ... La prochaine fois que je peux utiliser un bon code au lieu de hacks .. – Hulk

1

Je pense que l'injection d'un code Jquery/JS pour masquer le bouton de sauvegarde serait une bonne idée.

Créer un fichier custom_validate.js comme ci-dessous et le placer dans statique répertoire (répertoire de fichiers statiques)

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

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

Et admin.py, ajoutez le code ci-dessous.

class CustomDataForm(forms.ModelForm): 

    class Meta: 
     model = GetData 

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

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