2017-10-04 4 views
0

J'utilise un appel AJAX pour POSTER une valeur à mes vues. De mes vues, je trouve le produit basé sur la valeur (id) passée à mon avis. Je l'ajoute à ma facture et l'applique à mon contexte que je rends au bas de ma vue. Le contexte ne sera pas affiché tant que je ne me rafraîchirai pas, mais je ne peux pas l'avoir. Je suis coincé.Le contexte de Django Render n'affiche pas Till Refresh?

... 
elif request.is_ajax(): 
    product_id = request.POST.get('value') 
    if product_id: 
     product_info = Product.objects.get(id=product_id) 
     new_invoice_product = InvoiceProduct.objects.create(invoice_product_set=product_info) 
     invoice.attached_products.add(new_invoice_product) 
     context['attached_products'] = invoice.attached_products.all() 
... 

return render(request, 'inventory/invoice_create.html', context) 

Répondre

-1

Vous ne pouvez pas simplement rendre le DOM HTML du client directement par le serveur. Par l'intermédiaire de DjangoTemplate Engine, il rend juste le rendu et répond avec HTML lui-même. Cela signifie que vous ne pouvez pas mettre à jour le DOM du client avec ajax sauf si vous mettez à jour l'élément racine, <html>. (et ce sera comme même recharger la page!)

Ainsi, vous voudrez peut-être mettre à jour l'arborescence DOM avec certaines données, faire avec l'appel ajax puis mettre à jour avec le fichier json seulement. Si vous utilisez JsonResponse, vous pouvez l'obtenir avec l'objet de réponse AJAX.

Alors Ce que vous avez à faire n'est PAS un modèle de django mais une programmation JavaScript.

Dans votre views.py, faites comme ceci:

# in your views.py 
... 
elif request.is_ajax(): 
    product_id = request.POST.get('value') 
    if product_id: 
    product_info = Product.objects.get(id=product_id) 
    new_invoice_product = InvoiceProduct.objects.create(invoice_product_set=product_info) 
    invoice.attached_products.add(new_invoice_product) 
    context['attached_products'] = invoice.attached_products.all() 
    # return render(request, 'inventory/invoice_create.html', context) # NOT render but do like this: 
    return JsonResponse({ 
     'new_data': { 
      'id': new_invoice_product.id 
      # and other informations you want... 
     } 
    }) 

Dans votre code HTML, comme cela:

<script src="https://code.jquery.com/jquery-3.2.1.min.js" 
     integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" 
     crossorigin="anonymous"></script> 
<script> 
    // in your HTML 
    // guessing you're using jquery.. 
    $.ajax({ 
     url: "test.html", 
     context: document.body 
    }).done(function (json) { 
     $('yourSelector').append(json['new_data']['id']); 
    }); 
</script> 

Rappelez-vous, ce code est juste extrait pas de code de travail entièrement. Si vous voulez savoir d'autres exemples, jetez un oeil à lien:

https://simpleisbetterthancomplex.com/tutorial/2016/08/29/how-to-work-with-ajax-request-with-django.html

+0

Eh bien le problème que je ne comprends pas est que je suis Boucler dans mon modèle qui devrait afficher les « attached_products » qui est un champ ManyToMany dans ma facture Modèle qui attache des produits à certaines factures. Cela va-t-il toujours le faire? –

+0

Donc le concept est simple, "vous ne pouvez pas réécrire du HTML côté client". Le moteur de template django fonctionne uniquement avec le rendu côté serveur. Si vous utilisez AJAX, cela ne fonctionne pas. vous devez donc effectuer le rendu côté client avec JS. Il n'est pas pertinent avec les modèles MTM comme rendu HTML est juste 'String' pas réel-modèle python. – Beomi

+0

D'accord, cela a du sens. Pensez-vous que ma question est pertinente pour suivre? –