Federico De Marco
Federico De Marco

Reputation: 341

Django, how to reuse variable results get in a views in another one?

I have the following question for you. I want to know the best and elegant way to reuse some variable results obtained in a view in another one.

I'm trying to explain me better with an example.

I'have 2 differente app, app A and app B.

In app A views.py I have a lot of code to process data from the models with a creation of a lot of new variables. Now, in app B I have the necessity to reuse some variables obtained in views.py app A, but I wonna write again the same code to get them.

Is there a way to achive my goal?

EDIT

Following the @sandeshdaundkar's suggestions I could overcome my problem creating a new function and call it in my views.py of each app.

I'm trying to achive this result but I'm not good at python's function and how call it inside my views.py.

I have created the following function in my_app/utility.py:

def my_func():

    defaults = list(0 for m in range(13))
    iva_debito = dict()
    for year, month, totale in(Ricavi.objects.values_list( 'data_contabile__year', 'data_contabile__month').
        annotate(totale=ExpressionWrapper(Sum(F('quantita') * F('ricavo')*(F('iva'))),
        output_field=FloatField())).values_list('data_contabile__year', 'data_contabile__month', 'totale')):
        if id not in iva_debito.keys():
            iva_debito[id]=list(defaults)
        index=month
        iva_debito[id][index]=totale

    iva_debito_totale={'IVA a Debito Totale': [sum(t) for t in zip(*iva_debito.values())],}

    context= {
        'iva_debito_totale':iva_debito_totale,
    }

    return context

And here my my_app/views.py: ... from .utility import my_func

def iva(request):
    data = my_func()
    iva_debito_totale=data['iva_debito_totale']

    context= {
        'iva_debito_totale': iva_debito_totale,
    }

    return render(request, 'iva/iva.html', context)

I have solved it with the solution above.

Upvotes: 1

Views: 646

Answers (1)

sandeshdaundkar
sandeshdaundkar

Reputation: 903

def func_name():
        # do calculation,
        return context_for_view_one, obj_to_reuse

def view_one(request):
    context, iva = func_name()
    return render(context=context) # context to be used in view a

def view_two(request):
    context, iva = func_name()
    return render(context=iva) # iva to be used in view b
def iva(request):
    data = func_name()
    iva_debito_totale = data['iva_debito_totale']
    return render(request, 'template.html', context={'totale': iva_debito_totale})

I hope this gives you an idea, we return 2 objects from common function. One which is to be used in view_one and others to be used in view_two. You can try something similiar

Upvotes: 1

Related Questions