2
votes

ajax ne s'active pas, m'emmène sur une autre page

le code fonctionne comme je le souhaite, mais il m'emmène sur une page différente et j'ai quelque chose comme {"success": 1, "voteobj": 57}. J'ai été informé que l'Ajax est celui pour cela, mais je ne suis pas bon dans ce domaine. voici ce que j'ai. quelqu'un peut-il vérifier où j'ai fait une erreur et ce que je dois faire pour la corriger /?

class JSONFormMixin(object):
    def create_response(self, vdict=dict(), valid_form=True):
        response = HttpResponse(json.dumps(vdict), content_type='application/json')
        response.status = 200 if valid_form else 500
        return response

class VoteFormBaseView(FormView):
    form_class = VoteForm

    def create_response(self, vdict=dict(), valid_form=True):
        response = HttpResponse(json.dumps(vdict))
        response.status = 200 if valid_form else 500
        return response

    def form_valid(self, form):
        post = get_object_or_404(Post, pk=form.data["post"])
        user = self.request.user
        prev_votes = Vote.objects.filter(voter=user, post=post)
        has_voted = (len(prev_votes) > 0)

        ret = {"success": 1}
        if not has_voted:
            # add vote
            v = Vote.objects.create(voter=user, post=post)
            ret["voteobj"] = v.id
        else:
            # delete vote
            prev_votes[0].delete()
            ret["unvoted"] = 1
        return self.create_response(ret, True)


    def form_invalid(self, form):
        ret = {"success": 0, "form_errors": form.errors }
        return self.create_response(ret, False)



urls.py

urlpatterns = [   
    path('vote/', auth(VoteFormView.as_view()), name='vote'),

Et voici mon code python

<script type="text/javascript">
    jQuery(document).ready(function($) 
        {
    $(".vote_form").submit(function(e) 
        {
                e.preventDefault(); 
                var btn = $("button", this);
                var l_id = $(".hidden_id", this).val();
                btn.attr('disabled', true);
                $.post("vote/", $(this).serializeArray(),
                function(data) {
                        if(data["voteobj"]) {
                    btn.text("-");
                        }
                        else {
                    btn.text("+");
                        }
                });
                btn.attr('disabled', false);
        });
        });
</script>
<script
  src="https://code.jquery.com/jquery-3.4.1.js"
  integrity="sha256-WpOohJOqMqqyKL9FccASB9O0KwACQJpFTUBLTYOVvVU="
  crossorigin="anonymous"></script>


<form method="post" action="{% url 'vote' %}" class="vote_form">
    <li> [{{ post.votes }}]
        {{post}}
        {% csrf_token %}
        <input type="hidden" id="id_post" name="post" class="hidden_id" value="{{ post.pk }}" />
        <input type="hidden" id="id_voter" name="voter" class="hidden_id" value="{{ user.pk }}" />
        {% if not user.is_authenticated %}
        <p>login to vote</p>

        {% elif post.pk not in voted %}
            <button class="btn btn-primary">like</button>
        {% else %}
        <button class="btn btn-primary">dislike</button>
        {% endif %}
            </form>

Edit: J'ai suivi les instructions sur le site Web suivant: https://arunrocks.com/building-a-hacker-news-clone-in-django-part-4/

Tout fonctionne bien mais ajax de mon côté

Edit: Donc, sans ajax, l'url est http://127.0.0.1:8000/community/vote / Avec ajax, l'URL est / communauté / post / 3 / vote / mais il dit Non trouvé: sur le terminal


0 commentaires

3 Réponses :


0
votes
return JsonResponse(safe=False, ret)

13 commentaires

il va également sur une autre page / vote avec le message "{\" success \ ": 1, \" voteobj \ ": 64}"


thaty, vous ne l'appelez pas avec ajax. Vous devez utiliser ajax.


alors quel est le problème avec l'ajax? (comme je l'ai posté dans la question d'origine) plz help


Eh bien, vous ne l'utilisez pas. Il faut aller sur youtube et prendre le temps de l'apprendre. C'est important lors de l'utilisation de Django.


Je vois, pouvez-vous en écrire un juste cette fois?


J'ai besoin de voir des URL pour faire le reste.


hmmm toujours pas de travail Je publierai l'URL et ajouterai la prime à la question si cela aide


continuons cette discussion dans le chat .


Bonjour j'ai posté l'url


j'ai déjà édité ma réponse pour vous. ce que j'ai changé devrait fonctionner.


pourquoi y a-t-il vote2? pouvez-vous s'il vous plaît consulter le lien, tutoriel que j'ai suivi ??


ou comme solution alternative, cela ne me dérange pas de donner aux utilisateurs une nouvelle page (la page que je peux modifier donc plus conviviale). pour le moment, cela montre simplement {succès: 1


vote2 vous permet d'appeler une fonction Ajax / soumettre un formulaire sans changer de page,



0
votes
def vote2(request):
    if request.method == 'POST':
        response_json = request.POST
        response_json = json.dumps(response_json)
        data = json.loads(response_json)
        this_is_the_pk = data['query']
        this_is_the_comment = data['comment']
        this_is_the_comment2 = data['comment2']
return JsonResponse(safe=false)

0 commentaires

0
votes

Vous obtenez probablement une erreur indiquant que JQuery n'est pas défini, donc e.preventDefaults () ne s'exécute jamais et vous obtenez l'action standard d'envoi de formulaire. Essayez d'inclure la balise de script pour l'extraction dans JQuery avant ce script. Voici à quoi cela pourrait ressembler:

<script
  src="https://code.jquery.com/jquery-3.4.1.js"
  integrity="sha256-WpOohJOqMqqyKL9FccASB9O0KwACQJpFTUBLTYOVvVU="
  crossorigin="anonymous"></script>
<script type="text/javascript">
    jQuery(document).ready(function($) 
        {
    $(".vote_form").submit(function(e) 
        {
                e.preventDefault(); 
                var btn = $("button", this);
                var l_id = $(".hidden_id", this).val();
                btn.attr('disabled', true);
                $.post("vote/", $(this).serializeArray(),
                function(data) {
                        if(data["voteobj"]) {
                    btn.text("-");
                        }
                        else {
                    btn.text("+");
                        }
                });
                btn.attr('disabled', false);
        });
        });
</script>


<form method="post" action="{% url 'vote' %}" class="vote_form">
    <li> [{{ post.votes }}]
        {{post}}
        {% csrf_token %}
        <input type="hidden" id="id_post" name="post" class="hidden_id" value="{{ post.pk }}" />
        <input type="hidden" id="id_voter" name="voter" class="hidden_id" value="{{ user.pk }}" />
        {% if not user.is_authenticated %}
        <p>login to vote</p>

        {% elif post.pk not in voted %}
            <button class="btn btn-primary">like</button>
        {% else %}
        <button class="btn btn-primary">dislike</button>
        {% endif %}
            </form>

De plus, votre code HTML semble manquer de balise de fermeture .


0 commentaires