从另一个文件调用函数以在模板中使用

时间:2019-01-31 19:36:52

标签: python django python-3.x

我具有在此文件中创建百分比的功能

status.py

class Status:
    read_books = Books.objects.filter(read="True")
    all_books = Books.objects.all()

    def percentage(self):
        asdf = get_percentage(len(self.read_books),len(self.all_books))
        return asdf

我试图通过在模板中使用类似的功能来在模板中使用此功能来显示该百分比

{{ status.percentage }}

这可能吗?为此,我是否必须在逻辑中加入逻辑?

也许我可以将此函数放在我的视图类中并从那里调用它?

编辑:

views.py

class BooksView(TemplateView):
    template_name = 'KPI/Books.html'
    read_books = Books.objects.filter(read="True")
    all_books = Books.objects.all()


    def get_context_data(self, **kwargs):
        context = super(BooksView, self).get_context_data(**kwargs)
        context['all_books'] = self.all_books
        context['read_books'] = self.read_books    
        return context

2 个答案:

答案 0 :(得分:2)

。您只需要将Status对象传递给模板引擎(因此对于render(..),这是一个上下文变量)。

例如,对于一个视图,您可以这样写:

from some_module.status import Status

def some_view(request):
    # ...
    status = Status()
    return render(request, 'some_template.html', { 'status': status })

因此,现在模板上下文包含变量status,它只是一个Status对象,您可以像其他变量一样使用它。如果您编写{{ status.percentage }},它将调用precentage方法。

在基于类的视图中,您因此“修补”了get_context_data方法,就像@Andy这样说:

from some_module.status import Status

class BooksView(TemplateView):
    template_name = 'KPI/Books.html'
    read_books = Books.objects.filter(read="True")
    all_books = Books.objects.all()

    def get_context_data(self, **kwargs):
        context = super(BooksView, self).get_context_data(**kwargs)
        context['all_books'] = self.all_books
        context['read_books'] = self.read_books
        context['status'] = Status()
        return context

答案 1 :(得分:2)

如果使用class based view,则只需在上下文中添加状态对象。为此,请覆盖get_context_data方法:

class myView(View):
    #...
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        myStatus = Status()
        context['status'] = myStatus
        return context