【问题标题】:Django, how to reuse variable results get in a views in another one?Django,如何在另一个视图中重用变量结果?
【发布时间】:2020-08-26 20:19:03
【问题描述】:

我有以下问题要问你。我想知道在另一个视图中重用在视图中获得的一些可变结果的最佳和优雅的方法。

我试图用一个例子更好地解释我。

我有 2 个不同的应用程序,应用程序 A 和应用程序 B

在应用程序Aviews.py 中,我有很多代码来处理来自模型的数据,并创建了很多新变量。 现在,在应用程序B 中,我有必要重用在views.py 应用程序A 中获得的一些变量,但我不会再次编写相同的代码来获取它们。

有没有办法实现我的目标?

编辑

按照@sandeshdaundkar 的建议,我可以克服创建新函数并在每个应用程序的views.py 中调用它的问题。

我正在尝试实现这个结果,但我不擅长 python 的功能以及如何在我的views.py 中调用它。

我在 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

这里是我的 my_app/views.py: ... 从 .utility 导入 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)

我已经用上面的解决方案解决了。

【问题讨论】:

  • 创建一个在视图外执行通用计算的函数,并在两个视图内调用该函数
  • 谢谢,功能在哪些文件夹?
  • 您可以在同一个 Django 应用程序文件夹中创建一个utils.py 文件并在视图中导入或将函数写入views.py 本身。只要确保你的函数参数是正确的。
  • 啊,谢谢,我是 python 新手,你能否为我的视图做一个函数示例(只有一个变量)以及如何在我的视图中使用它?
  • 好的,让我检查一下。

标签: django django-models django-rest-framework django-forms django-views


【解决方案1】:
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})

我希望这能给你一个想法,我们从通用函数返回 2 个对象。一个将在 view_one 中使用,其他将在 view_two 中使用。你可以试试类似的东西

【讨论】:

  • 非常感谢您,您的回答非常有用,但我正在尝试遵循您的建议,但我很难达到目标。我已经用你的答案编辑了我的问题。你能帮帮我吗?
  • 在视图中调用该函数并将其返回值分配给变量。使用var_name['iva_debito_totale']访问密钥
  • 不起作用,django 给我以下错误my_function() missing 1 required positional argument: 'request' 。我已经根据您的建议和错误更新了我的答案
  • 请将您的问题编辑为仅当前的 views.py 文件。系统中的单个文件。
  • 这应该可以,请使用pdb 库进行调试,同时检查哪一行破坏了代码。函数和调用对我来说似乎是正确的。
猜你喜欢
  • 2019-03-24
  • 1970-01-01
  • 2022-01-16
  • 2022-01-21
  • 1970-01-01
  • 2019-11-18
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多