1 votes

Je cherche un bon exemple d'utilisation de get_ou _create dans des vues Django et de déclenchement d'une erreur de formulaire.

Je cherche un bon exemple de la manière de réaliser ce qui suit :

Je voudrais utiliser get_or_create pour vérifier si un objet existe déjà dans ma base de données. S'il n'existe pas, il sera créé. S'il existe, je ne créerai pas le nouvel objet, mais j'aurai besoin de générer une erreur de formulaire pour informer l'utilisateur qu'il doit entrer des données différentes (par exemple, un nom d'utilisateur différent).

La vue contient :

p, created = Person.objects.get_or_create(
   email = registration_form.cleaned_data['email'],
   defaults = {
       'creationDate': datetime.datetime.now(),                
       'dateOfBirth': datetime.date(1970,1,1)
})

Ainsi, 'p' contiendra la personne existante si elle existe, ou la nouvelle personne si elle n'existe pas. J'aimerais agir sur la valeur booléenne de 'created' afin d'ignorer l'enregistrement de la personne, de réafficher le formulaire d'enregistrement et de générer une erreur de validation de formulaire appropriée.

L'alternative que j'envisage est de faire une vérification dans une méthode de validation de formulaire personnalisée pour voir si une personne existe avec les données dans le champ 'email' fourni, et de générer simplement une erreur de validation.

3voto

KillianDS Points 10401

Ce n'est pas un bon exemple d'utilisation de get_or_create. La validation du formulaire (ce que vous essayez manifestement de faire) vient avant l'enregistrement et les deux ne devraient pas être mélangés du tout. Vous devez vous assurer que votre formulaire est validé avant de l'enregistrer, mais la vérification de l'existence de l'objet fait partie de la validation.

Dans la méthode clean() de votre formulaire, écrivez quelque chose comme ceci :

try:
    Person.objects.get(email=...)
    raise forms.ValidationError(...)
except Person.DoesNotExist:
    pass

C'est l'alternative que vous avez proposée et c'est la solution la plus raisonnable.

Une bonne utilisation de get_or_create est par exemple une bibliothèque de balises, où vous voulez que de nouvelles balises soient créées à la volée ou que des informations sur les anciennes balises soient collectées, sans avoir à écrire des try/except tout le temps.

Edit : aussi, si vous voulez faire cela pour éviter le cycle séparé get/create plus tard, assurez-vous d'utiliser les modelforms. La méthode save des modelforms vous renvoie l'instance qui vient d'être créée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X