web-dev-qa-db-fra.com

Comment puis-je appeler une fonction Django au clic d'un bouton?

J'essaie d'écrire une application Django et je suis bloqué sur la façon d'appeler une fonction d'affichage lorsqu'un bouton est cliqué.

Dans mon modèle, j'ai un bouton de lien comme ci-dessous, lorsque vous cliquez dessus, il vous amène à une autre page Web:

<a target="_blank" href="{{ column_3_item.link_for_item }}">Check It Out</a>

Lorsque le bouton est cliqué, je veux également appeler une fonction de vue Django (avec redirection vers un site Web cible). La fonction de vue incrémente la valeur dans la base de données qui stocke le nombre de fois le bouton est cliqué.

Le column_3_item.link_for_item est un lien vers un site Web externe (par exemple www.google.com). En ce moment, lorsque ce bouton est cliqué, il ouvre une nouvelle fenêtre qui vous amène au site Web Google.

Ce que je voudrais faire, c'est appeler une fonction de vue Django également lorsque l'on clique sur le bouton qui met à jour la base de données sans rafraîchir la page. Comment puis-je y parvenir?

26
Dev

voici une approche minimaliste pure javascript. J'utilise JQuery mais vous pouvez utiliser n'importe quelle bibliothèque ( ou même aucune bibliothèque du tout ).

<html>
    <head>
        <title>An example</title>
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
        <script>
            function call_counter(url, pk) {
                window.open(url);
                $.get('YOUR_VIEW_HERE/'+pk+'/', function (data) {
                    alert("counter updated!");
                });
            }
        </script>
    </head>
    <body>
        <button onclick="call_counter('http://www.google.com', 12345);">
            I update object 12345
        </button>
        <button onclick="call_counter('http://www.yahoo.com', 999);">
            I update object 999
        </button>
    </body>
</html>

Approche alternative

Au lieu de placer le code JavaScript, vous pouvez modifier votre lien de cette façon:

<a target="_blank" 
    class="btn btn-info pull-right" 
    href="{% url YOUR_VIEW column_3_item.pk %}/?next={{column_3_item.link_for_item|urlencode:''}}">
    Check It Out
</a>

et dans votre views.py:

def YOUR_VIEW_DEF(request, pk):
    YOUR_OBJECT.objects.filter(pk=pk).update(views=F('views')+1)
    return HttpResponseRedirect(request.GET.get('next')))
29
furins

La réponse suivante pourrait être utile pour la première partie de votre question:

Django: Comment puis-je appeler une fonction de vue à partir d'un modèle?

2
Mahshid Zeinaly