10
votes

Existe-t-il une approche idiomatique à Django pour écrire JavaScript discret et / ou faire des soumissions de formulaire AJAX?

Je suis un développeur Ruby / Rails travaillant maintenant dans un magasin Python / Django. J'ai commencé à se réchauffer à Python, cependant, je me débats toujours pour trouver Django comparable aux rails dans certains aspects que je trouve important. Beaucoup de mes travaux actuels et futurs se concentreront sur la création de demandes Ajax à notre API. En tant que développeur de rails, j'aurais utilisé JavaScript discret et en particulier sur les soumissions de formulaire ajouté une étiquette de données-distance, comme indiqué ci-dessous.

J'écris alors une méthode dans le contrôleur pour gérer la demande et aurait écrit Fonction JavaScript / JQuery utilisant la délégation d'événements dans un fichier JS situé dans le répertoire / actifs / JS pour gérer la réponse du côté client. J'ai supposé venir à Django, il y aurait une manière similaire d'implémenter ce type de fonctionnalité. P>

Ce que je suppose que j'essaie vraiment de dire, c'est que Django offrirait une "magie" similaire à des rails en termes de termes De ne pas avoir à écrire des fonctions JQuery Ajax à chaque fois que je voulais faire une demande Ajax. J'ai écrit une comparaison approximative (très rugueuse) de la façon dont j'écrirais ces deux. Je cherche à apprendre s'il s'agit d'une approche incorrecte de ce que je ferais dans des rails à Django. Je sais que Stackoverflow n'est pas destiné aux opinions, mais je pense que des principes de rupture qui ne s'appliquent que quelles sont la langue / la structure que vous utilisez, c'est-à-dire que l'assèchement du code en n'écrivait pas les fonctions AJAX encore et encore, n'est pas vraiment contre une opinion. C'est plus comme briser une règle acceptée. P>

Mon approche actuelle de travailler avec Ajax Demandes à Django se sent mal, ou peut-être que je suis juste habitué aux rails "magiques" offres via la télécommande de données = " vrai "attribut. J'adorerais des conseils sur le sujet pour m'aider à déterminer une approche solide, merci. p>

rails forts> em> p>

vues / quelque_controller / form.html.erb strong> p> P> xxx pré>

actifs / javascripts / quelque_model.js strong> p> xxx pré>

contrôleurs / quelque_controller.rb forte > p> xxx pré>

Django strong> em> p>

Certains_app / modèles / form.html Strong> p> xxx pré>

quelque_app / statique / actif / js / js / certains_app.js strong> p>

$("#form").on("submit", function(event) {
  $.ajax({
    type: "POST",
    beforeSend: function (request) {
      request.setRequestHeader("X-CSRFToken", csrftoken);
    },
    data: data,
    url: "endpoint",
    dataType: 'json',
    contentType: 'application/json',
    }).done(function(data) {
      cb(null, data)
    }).fail(function(data) {
      cb(data)
    }).always(function(data) {
      cb(data)
    })
  });
});


5 commentaires

"Y a-t-il un moyen idiomatique d'exprimer cet idiome rubis / rails comme python idiomatique / django?" C'est une question parfaitement acceptable. Cela montre que vous avez fait vos recherches.


Avez-vous regardé cela encore? docs.djangoproject.com/fr/dev / ref / demande-réponse / ...


Hey Jason, j'ai vu ces documents. C'est un excellent moyen de gérer si l'appel est AJAX ou non. Mais je pense que ma question était davantage quant à savoir si une approche idiomatique était similaire à la manière dont les rails ont des UJS. J'ai trouvé une bibliothèque de Django-Ujs, mais cela ne semble pas être maintenu. Ajouter Data-Remote = "true" sur un formulaire HTML ou un lien envoie la demande via AJAX. Je pense peut-être qu'un filtre de modèle pourrait être utilisé pour faire la même chose. Je vais faire d'autres recherches et découvrir.


Afaik La plupart des rails "Magic" provient de plugins JavaScript offerts par des rails ( rails.js dans votre exemple). Django ne se concentre que sur Python et n'offre pas de modèles et de fichiers statiques de nombreux éléments intégrés de la boîte (sauf dans des solutions pleinement soufflé telles que Admin), vous devez donc le faire de manière simple. Rien ne se tiendrait dans votre chemin si vous souhaitez implémenter Tags de modèle supplémentaire et django.js < / Code> pour encapsuler ces vous-même, cependant.


@Evkline: Pourriez-vous donner des commentaires sur les réponses offertes? Cela m'aidera à récompenser la prime. Si vous avez déjà résolu le problème de manière différente, vous pouvez écrire votre solution comme réponse.


3 Réponses :


1
votes

Ce n'est pas un moyen de le faire facilement dans Django, mais avec quelques bibliothèques supplémentaires, vous pouvez faciliter la manipulation des postes de formulaire AJAX.

CSRFProtection.js - Cela ajoutera l'en-tête de jeton CSRF sur vos demandes Ajax . P> xxx pré>

inclure la bibliothèque JavaScript jquery.form.js . En utilisant cette bibliothèque vous permettra de faire quelque chose comme ce qui suit: P>

$('#form_id').ajaxSubmit({
    success: function(response) {console.log(response);},
    error: function(response) {console.log(response);}
});


0 commentaires

1
votes

Je ne crois pas qu'il y ait un idiome originaire de Django même. Il existe toutefois des applications réutilisables qui offrent des implémentations très couramment utilisées.

Les formes croustillantes, par exemple, peuvent simplifier les formulaires Django Ajax. Pas besoin de faire de la manutention du CSRF avant la demande. Exemple de leur Tutoriel : xxx


0 commentaires

9
votes

La réponse à votre question est non. Il n'y a pas d'approche idiomatiques AJAX avec Django. Il n'a pas d'opinion sur AJAX, en particulier sur le frontend

Le back-end a tendance à suivre des modèles similaires en raison des vues basées sur les classes de façon (CBV) sont structurés. il est fréquent de voir d'un simple AJAXResponseMixin code> mélangé dans CBV qui met à profit le fait toutes les vues génériques génèrent de manière fiable leur contexte par une seule méthode get_context_data ​​code>. Les mixins peuvent simplement prendre ledit contexte et le convertir en JSON p>

Il n'y a pas de modèles AJAX forcé sur django. vous avez simplement à construire votre propre la façon dont vous le souhaitez. p>

Si vous aimez la façon dont votre exemple rails le fait, pourquoi pas? p>

Le but de cet exercice est de vous montrer comment petit cadre est vraiment impliqué dans cette idée. Il est une poignée de lignes de code. P>

Tout d'abord, nous allons reproduire votre données à distance = système true code> et écouteur d'événement en utilisant la syntaxe que vous avez décrit. Notez que ceci est tout le code pseudo. P>

class AJAXFrameworkMixin(object):
    """ A more advanced, reusable pattern for class based views.
    Perhaps also allowing partial rendering via custom header `RENDER_PARTIAL` used by the jQuery request.
    """
    def dispatch(self, request, *args, **kwargs):
        if request.is_ajax():
            partial = request.META.get('X_RENDER_PARTIAL')
            if partial:
                return self.handle_ajax_partial(request, partial)
            return self.handle_ajax(request)

        return super(AJAXFrameworkMixin, self).dispatch(request, *args, **kwargs)

    def handle_ajax(self, request):
        """ Ajax specific handler.
        Convert this view context into JSON.
        """
        ctx = self.get_context_data()
        return http.HttpResponse(json.dumps(ctx))

    def handle_ajax_partial(self, request, partial):
        """ Given a render partial header from the barebones AJAX framework, render said partial with context.
        """
        t = template.loader.get_template(partial)
        return t.render(template.RequestContext(request, self.get_context_data()))


0 commentaires