1
\$\begingroup\$

I have a ListView that displays every customer (class Cliente in my code) of a company. Every Cliente object has a specific id (piva in my code) that is necessary to make a third party API call. My goal was to press a button in the template that makes an API call for every Cliente object in my ListView queryset.

To accomplish this I overwrite the get_context_data method in the ListView to include a tuple of piva:

def get_context_data(self, *, object_list=None, **kwargs):
    ctx = super().get_context_data()
    pive = pive_extraction(self.get_queryset())  # pive_extraction(qs: QuerySet[Cliente]) -> tuple[str]
    ctx['pive'] = pive
    return ctx

In my ListView template I have this form:

<form action="{% url 'crm:cerved-multiple-api-call' %}" method="POST">
    {% csrf_token %}
    <input hidden name="ricerca" id="ricerca" value="{{pive}}">
    <button>Arricchimento Cerved di tutti i clienti</button>
</form>

Pressing the button perform the action on this view:

def cerved_multiple_api_call_view(request):
    if request.POST:
        pive = eval(request.POST['ricerca'])
        for piva in pive:
            data = cerved_api_call(piva) # third party API call
            # some non-relevant code where I work with 'data'

        return redirect('crm:cliente-list')

The code works fine and an API call is done for every Cliente in my ListView queryset; But inserting a tuple of piva ids in the context, pass it as request.POST data, getting it eval() back into a tuple[str] (because it becomes a single str when passed in request.POST) and then performing an API call for every 'str' in my tuple smells like bad code. Any response is appreciated.

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.