2010-06-16 87 views
6

en modelos:modelos de Django evitar duplicados

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

En las plantillas:

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

Si el usuario hace clic en el botón de guardar y los datos anteriores se guarda en la tabla, cómo evitar los duplicados , es decir, si el usuario vuelve a hacer clic en el mismo botón de envío, no debería haber otra entrada para los mismos valores. ¿O es algo que debe manejarse en vistas?

Respuesta

16

Si un campo individual tiene que ser único, a continuación, que acaba de añadir 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 desea una combinación de campos que ser único, es necesario 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

gracias ....................... – Hulk

+0

También cuando se llama a getdata en vistas para el segundo ejemplo de forma predeterminada, esto dará como resultado "título" , "estado" y "nombre" es? – Hulk

+0

Cuando hace referencia a un objeto Getdata en una vista, obtiene un objeto Getdata con todos sus campos. –

2

El unique_together También se sugiere la mejor manera, pero si eso no es apropiado para sus necesidades, puede manejarlo en el método de limpieza de su formulario. por ejemplo,

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

Gracias, buena explicación. – Hulk

+1

También he visto, para el caso de envío múltiple, que las personas pongan JavaScript que deshabilita el botón Enviar cuando se hace clic y el formulario es presentada. La mejor solución es probablemente una combinación de todos estos. –

+0

En mi código he hecho lo mismo por el momento ... pero esto era inconsistente de otros ... así que tenía que saber sobre esto ... La próxima vez puedo usar un código adecuado en lugar de piratear ... – Hulk

1

Creo que sería una buena idea inyectar un código Jquery/JS para ocultar el botón guardar.

Crear un archivo custom_validate.js como el de abajo y lo coloca en el directorio estática (directorio de archivo estático)

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

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

Y en admin.py, agregue el código siguiente.

class CustomDataForm(forms.ModelForm): 

    class Meta: 
     model = GetData 

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

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