7
votes

8 Réponses :


2
votes

La manière dont la méthode de traitement des formes de traitement mélange deux préoccupations: présenter un formulaire pour éditer et traiter les résultats. Vous pouvez le casser en deux méthodes, ce qui introduirait une certaine duplication sous la forme d'appels identiques rendu_to_reesponse (). Au moment où vous avez refoulé cela, vous pourrait vous retrouver avec quelque chose moins lisible que le formulaire à la méthode unique ci-dessus.

Quand je regarde la méthode de la batterie, je ne vois pas de duplication. Les deux utilisations de contact de contact () sont distinctement différentes. Les deux conditionnels me semblent de montrer assez proprement les transitions de l'état impliquées dans le traitement d'une forme (présenter une forme vierge, accepter des soumissions jusqu'à ce que l'on soit valide, processus et redirection).


0 commentaires

0
votes

On pourrait écrire une fonction qui gère les conditionnels pour toutes les formes. Vous pouvez le faire en passant dans une fonction spécifique à ce formulaire après "IS_VALID", telle que: xxx

alors vous appelleriez Formhandler de votre vue. Notez que cela n'est pas testé et peut avoir des erreurs.


0 commentaires

0
votes

Django fournit plusieurs vues génériques pour Création, modification et suppression des objets . Peut-être que vous pourriez essayer ces.


0 commentaires

10
votes

Vous pouvez éviter la répétition, bien sûr. La plupart du temps, vous devez transmettre comme des arguments la classe de formulaire et le nom du modèle à utiliser, appelant à traiter les données nettoyées lorsqu'un formulaire valide est soumis et une destination pour la redirection après ce traitement; De plus, vous avez besoin d'un petit code supplémentaire pour appeler la classe de formulaire juste une fois, pour produire une forme liée ou non liée et la traiter correctement. I.E .:

def process_any_form(request, 
                     form_class, template_file_name,
                     process_data_callable, redirect_destination):

    form = form_class(request.POST if request.method == 'POST' else None)

    if form.is_bound and form.is_valid():
        process_data_callable(form.cleaned_data)
        return HttpResponseRedirect(redirect_destination)

    return render_to_response(template_file_name, {'form': form})


2 commentaires

Cela marche. Si le modèle veut plus que «former», vous devez élargir la liste des arguments à inclure, par exemple, un hachage de valeurs.


s / hachage / dict /, mais, oui, bonne idée: Vous pouvez passer dans un dict D crze d semi-pré-peuplé pour le contexte et utiliser dict (D, formulaire = formulaire) comme contexte de rendu, cela fait la solution encore plus général.



1
votes

Le gestionnaire générique d'Alex m'a battu, mais fwiw nous tendons vers une version moins générique de sa suggestion: xxx

si POST_DATA n'est pas, le formulaire est instancié comme il a été utilisé. Sinon, le traitement lié se poursuit normalement. Il évite une construction dupliquée de contact de contact, mais je suis d'accord avec la réponse de Dave que la construction en double ne me dérange pas comme étant une duplication précisément parce que les paramètres de construction sont différents.


0 commentaires

1
votes

Je suis tellement fatigué de cela que j'ai écrit mes propres vues génériques pour le gérer. Dans le processus, j'ai découvert que django a déjà underocumentée générique Vues pour le traitement des formulaires. Ce sont des analogues assez directs de la vue générique documentée, mais acceptent les formulaires et suivent essentiellement le même modèle que vous avez utilisé dans votre exemple. Finalement, je les ai trouvés trop inflexibles et stupides pour mon usage (je ne veux pas une vue Create_or_Update, je ne voudrais pas traiter ces deux actions séparément.)

Edit: Vous n'avez pas aimé la réponse de Fragsworth, qui pointe de La même chose dont je parle, je suppose que tu ne veux pas "comme la mienne non plus. Voici un exemple pour la façon dont cela fonctionne. xxx

ContactForm doit avoir un Enregistrer () méthode, et c'est là que passe la logique de traitement de votre formulaire.


0 commentaires

0
votes

Vous pouvez contourner le module de formulaires de Django et tout simplement le faire à l'ancienne façon de la mode, vous obtenez plus de flexibilité sans trop de perte IMHO.

La dernière fois que j'ai regardé Django Forms était il y a longtemps, je ne sais pas si les choses ont changé, mais par exemple, cela ne vous permet pas de construire une forme de style Ajax; au moins pas facilement.


0 commentaires

6
votes

Vous avez raison, cela pourrait être meilleur, voici une meilleure alternative (mais continue à lire): xxx pré>

Cet extrait provient d'une conversation appelée Utilisation de formulaire Django avancé de Djangocon11. p>

Notez que cela traitera une forme vide comme valide ( Même avant la soumission) Si tous les champs sont facultatifs et que vous n'utilisez pas la protection CSRF. Donc, pour éliminer ce risque, vous pouvez utiliser celui-ci: P>

    def contact(request):
     form = ContactForm(request.POST or None) # A form bound to the POST data
     if request.method == 'POST' and form.is_valid(): # All validation rules pass
        # Process the data in form.cleaned_data
        # ...
        return HttpResponseRedirect('/thanks/') # Redirect after POST

     return render_to_response('contact.html', {
        'form': form,
     })


0 commentaires