How to pass pk value in the forms and correctly call view.py method , showing a confirmation modal in django

The problem is that i dont see any print or log messages in my views.py , which made me to a conclusion that that method is not method is not being called.

What i want to is to cancel subscription of a customer via button and show modal for confirmation.

View.py :

  @login_required
def cancel_subscription(request, pk):
    print("came to cancel sub")
    if request.method == 'POST':
        print("came to cancel sub")
        subscription = get_object_or_404(Subscription, pk=pk)
        subscription.status = 'expired'
        subscription.save()
        messages.success(request, 'Subscription cancelled successfully.')
        return redirect('customer_detail', pk=subscription.customer.pk)
    else:
        messages.error(request, 'Invalid request method.')
        return redirect('customer_list')

customer_detail.html

{% for subscription in subscriptions %}
  <button onclick="confirmCancelSubscription('{{ subscription.id }}')" class="flex items-center px-5 h-11 rounded-lg bg-error text-error-content hover:bg-error/90 transition-colors font-medium shadow-sm">
                            <svg class="h-5 w-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
                                <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
                            </svg>
                            <span>Cancel Subscription</span>
                        </button>
{% endfor %}
 <script>
                function confirmCancelSubscription(subscriptionId) {

            document.getElementById('cancelSubscriiptionModal').classList.remove('hidden');
            const form = document.getElementById('cancelSubscriiptionModal');
            form.action = "/cancel_subscription/" + subscriptionId + "/";
            console.log(subscriptionId);
            
            
        }
        
        function closeModal() {
            document.getElementById('cancelSubscriiptionModal').classList.add('hidden');
        }
                </script>

my form.html

<div id="cancelSubscriiptionModal" class="  hidden fixed inset-0 bg-black/50  items-center justify-center z-50">
    <div class="bg-base-100 rounded-lg shadow-xl border-2 border-base-300 w-full max-w-lg mx-4">
        <div class="px-6 py-4 border  flex  flex-col justify-between items-center">
        
        <form method="POST" class="flex flex-col gap-10"  >
            {% csrf_token %}
            <p class="text-black dark:text-white">Are you sure you want to cancel this subscription?</p>
            <div class="flex flex-row gap-20">
                <button type="button" onclick="closeModal()" class="px-4 py-2 text-sm font-medium text-gray-700 hover:text-gray-800 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700 rounded-md transition-colors">
                    Cancel
                </button>
                <button type="submit" class="px-4 py-2 text-sm font-medium text-white bg-blue-600 hover:bg-blue-700 rounded-md transition-colors">
                    Confirm
                </button>
            </div>    
        </form>
        </div>
    </div>
</div>

urls.py :

path('cancel_subscription/<int:pk>/', cancel_subscription, name='cancel_subscription'),
path('<int:pk>/view/', customer_detail, name='customer_detail'),

your JavaScript is trying to set it dynamically using document.getElementById('cancelSubscriiptionModal'), but cancelSubscriiptionModal is a div, not a form.

Rewrite your template form :

<form method="POST" id="cancelSubscriptionForm">
    {% csrf_token %}
    <p class="text-black dark:text-white">Are you sure you want to cancel this subscription?</p>
    <div class="flex flex-row gap-20">
        <button type="button" onclick="closeModal()" class="px-4 py-2 text-sm font-medium text-gray-700 hover:text-gray-800 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700 rounded-md transition-colors">
            Cancel
        </button>
        <button type="submit" class="px-4 py-2 text-sm font-medium text-white bg-blue-600 hover:bg-blue-700 rounded-md transition-colors">
            Confirm
        </button>
    </div>    
</form>

and update your js

function confirmCancelSubscription(subscriptionId) {
    document.getElementById('cancelSubscriiptionModal').classList.remove('hidden');
    const form = document.getElementById('cancelSubscriptionForm'); // Get the form, not the div
    form.action = "/cancel_subscription/" + subscriptionId + "/"; // Set form action
    console.log("Subscription ID: ", subscriptionId);
}

In your browser console check if subscriptionId is undefined, ensure that confirmCancelSubscription('{{ subscription.id }}') correctly passes the ID.

Вернуться на верх