2010-08-19 5 views
1

Le contenu de mon formulaire doit être soumis à un autre serveur d'applications pour validation et exécution (en particulier, j'appelle un service Web RESTful avec les valeurs affichées dans le formulaire). Le service renvoie une erreur 200 SUCCESS ou une erreur 400/409 avec un corps qui décrit les erreurs de champ exactes.Quand dois-je soumettre les résultats de mon formulaire Django?

Quand devrais-je faire cette soumission? Dois-je le faire dans la vue:

if form.is_valid: 
    result = submit_to_service(POST) 
    if result.code in (400, 409): 
     somehow_set_errors_on_the_form(form) 
    else: 
     go_on... 

Ou dans la méthode Form.clean?

def clean(self): 
    result = submit_to_service(POST) 
    if result.code in (400, 409): 
     for field in result.errors: 
      self._errors[field].append(result.errors[field]) 
    else: 
     pass 

Lequel de ces éléments est le plus clair?

Répondre

2

validation et de l'exécution

Aucune exécution ou modification stateful sous forme clean(). S'il vous plaît. La forme clean() du formulaire ne doit jouer que sur les données du formulaire, et pas ailleurs.

S'il y a un changement avec état, il doit être dans une fonction de vue à l'intérieur d'un gestionnaire de requêtes non-GET.

+0

pouvez-vous donner un bref exemple s'il vous plaît? –

+0

@AJ: Je n'en ai pas besoin. Exemple 1 dans la question - si elle se produit dans une fonction de vue - est préférable. –

+0

J'ai compris. Merci beaucoup. –

0

Habituellement, j'encapsule ce type de logique dans le formulaire. Puisque vous utilisez le formulaire pour valider les données, vous les utilisez également pour envoyer les données. Cela a du sens car le formulaire connaît déjà les données et leurs types, etc. (il a le dictionnaire cleaned_data). Mais les données de traitement et l'état changeant de votre application ne doivent pas vivre directement dans votre logique de validation (par exemple dans votre méthode clean). Vous devriez le mettre dans une méthode supplémentaire de votre formulaire - comme ModelForm le fait avec la méthode save().

Donc, ma suggestion est d'avoir une méthode supplémentaire nommée save() (si la méthode effectivement enregistre votre traitement au service REST) ​​ou post_result() ou quelque chose de similaire qui convient le mieux.

Voici un exemple:

# forms.py 

class ValidateDataForm(forms.Form): 
    ... 

    def clean(self): 
     # validation logic 

    def save(self): 
     post_results_to_service(self.cleaned_data) 

# views.py 

def view(request): 
    if request.method == 'POST': 
     form = ValidateDataForm(request.POST) 
     if form.is_valid(): 
      form.save() 
    else: 
     form = ValidateDataForm() 

qui précède suppose que le service REST est en train de changer l'état de votre application , par exemple il implémente une logique métier. Si ce n'est pas le cas et que vous utilisez uniquement le service comme validation pour les données d'entrée sur votre formulaire - et utilisez les données de formulaire, puis pour quelque chose de différent - je suggérerais quelque chose de différent .

Dans ce cas, le code doit entrer dans la méthode clean() comme vous l'avez suggéré dans votre deuxième exemple de code.

Questions connexes