2010-04-13 2 views
1

Je cherche un bon exemple de la façon d'atteindre les objectifs suivants:Vous cherchez un bon exemple d'utilisation de get_or _create dans les vues de Django et d'élever une erreur de formulaire

Je voudrais utiliser get_or_create pour vérifier déjà si un objet existe dans ma base de données. Si ce n'est pas le cas, il sera créé. Si cela existe, je ne créerai pas le nouvel objet, mais je devrais déclencher 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) 
}) 

So « p » contiendra la personne existante si elle existe, ou la nouvelle personne sinon. Je voudrais agir sur la valeur booléenne dans 'created' afin d'éviter d'enregistrer la Person et de réafficher le registration_form et de déclencher une erreur de validation de formulaire appropriée.

L'alternative que je considère est de faire une vérification dans une méthode de validation de formulaire personnalisé pour voir si une personne existe avec les données dans le champ 'email' fourni, et juste soulever une erreur de validation.

Répondre

3

Ceci n'est pas un bon exemple d'utilisation de get_or_create. La validation de formulaire (que vous essayez évidemment de faire) vient avant l'enregistrement et ceux-ci ne doivent pas être mélangés du tout. Vous devez être sûr que votre formulaire a été validé avant d'enregistrer, mais le contrôle "existe déjà" fait partie de la validation.

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

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

C'est l'alternative que vous proposez et est la solution la plus raisonnable. La bonne utilisation de get_or_create est par exemple une bibliothèque de tags, où vous voulez créer de nouvelles balises à la volée ou des informations sur les anciennes balises collectées, sans avoir à écrire try/excepté tout le temps.

Éditer: aussi, si vous vouliez faire ceci pour éviter le cycle get/create séparé plus tard, assurez-vous d'utiliser modelforms. La méthode save de modelforms vous renvoie l'instance nouvellement créée.

+0

Merci pour l'astuce sur la méthode save() ModelForms. difficile de trouver ça! – pfctdayelise

Questions connexes