2 votes

Comment traiter les prix de modèles spécifiques dans Django avec Stripe

Voici donc mon code avant tout. Je suis nouveau dans Django et j'essaie de créer un site de commerce électronique. Le fonctionnement est le suivant : l'administrateur crée des produits et les utilisateurs viennent sur le site et les achètent. Le site utilise Stripe pour traiter les paiements.

views.py :

    from django.shortcuts import render
    from django.views import generic
    from django.core.paginator import Paginator
    from django.conf import settings
    import stripe
    import decimal

    stripe.api_key = settings.STRIPE_SECRET_KEY

    from .models import Product
    # Create your views here.
    class ProductListView(generic.ListView):
        model = Product
        paginate_by = 3
        def get_context_data(self, **kwargs): # new
            context = super().get_context_data(**kwargs)
            context['key'] = settings.STRIPE_PUBLISHABLE_KEY
            return context

    def charge(request):
        if request.method == 'POST':
            charge = stripe.Charge.create(
                amount=round(decimal.Decimal(request.POST['price'])),
                currency='usd',
                description='A Django charge',
                source=request.POST['stripeToken']
            )
        return render(request, 'store/charge.html')

product_list.html:

{% extends 'home/base_generic.html' %}
{% load static %}
{% load cool_paginate %}
{% block add %}
  <link rel="stylesheet" href="{% static 'store/css/products.css'%}">
{% endblock %}
{% block title %} <title> Store </title> {% endblock %}
{% block content %}
<div class="row">
{% for product in product_list %}
<div class="col-sm-4">
  <div class="card" id="django-card" style="width: 300px; height: 350px;">
    <img class="card-img-top" src="{{ product.image.url }}" height=150px width=150px>
    <div class="card-body">
      <h5 class="card-title">{{ product.name }}</h5>
      <p class="card-text">
        {{ product.description }} And only {{ product.price }}!
      </p>
      <form action="{% url 'charge' %}" method="post">
        {% csrf_token %}
        <script src="https://checkout.stripe.com/checkout.js" class="stripe-button"
          data-key="{{ key }}"
          data-description="A Django Charge"
          data-amount= "{{ product.price_in_cents }}"
          data-locale="auto">
        </script>
        <input type="hidden" name="price" value="{{ product.price_in_cents }}">
      </form>
    </div>
  </div>
</div>
{% endfor %}
<div class="container-fluid">
  <div style="margin-top: 50px;"> {% cool_paginate page_obj=product %}</div>
</div>
</div>
{% endblock %}

Ma question est donc la suivante : lorsque l'utilisateur sélectionne un produit à acheter, comment puis-je indiquer à la vue d'utiliser le prix de ce produit ? La façon dont je l'ai fait est d'utiliser un champ de valeur html caché dans l'entrée. Mais cela ne peut pas être sécurisé. Merci à tous ceux qui ont pris le temps de répondre.

0voto

A. Khan Points 21

Ok, après quelques heures de travail éreintant, j'ai résolu le problème. J'ai choisi de garder le formulaire de champ caché mais au lieu d'utiliser le prix, je l'ai utilisé pour retourner la clé primaire du produit. Ce que j'ai utilisé dans la vue pour récupérer le prix et faire des frais.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X