Django:视图中的视图

时间:2012-08-03 19:37:46

标签: python django django-templates django-views

这可能看起来非常基本,但是,虽然我猜,但是如何在视图中创建视图,或者更准确地说,如何在动态模板中创建动态模板。你看,我有这些html块包含某些东西的统计数据。如何创建一个返回其中一个框的视图,以便另一个视图可以将它们插入到模板块中?是吗"好的"只是有一个返回它的功能,或者我是否必须"像普通函数一样,使用相同的functionName(request)而不是functionName(info1, info2, info3)。这似乎是一种常见的事情,会有某种标准。

2 个答案:

答案 0 :(得分:2)

这正是custom template tags - 特别是包含标签 - 的用途。

答案 1 :(得分:1)

如果我理解你,你基本上是在谈论预先填充模板上下文。基本上,您希望在许多视图中出现一个共同的上下文,但您不希望为每个视图重复自己。使用基于函数的视图,最好的方法是简单地使用通用方法来处理这个问题:

def add_some_context(context={}):
    context['foo'] = 'bar'
    return context

def view1(self, request):
    context = {
        'something1': 'blah',
    }
    return render_to_response('template1.html', add_some_context(context), context_instance=RequestContext(request))

def view2(self, request):
    context = {
        'something2': 'blah',
    }
    return render_to_response('template2.html', add_some_context(context), context_instance=RequestContext(request))

然后,两个视图都会有一个foo上下文变量。使用基于类的视图,您可以创建一个mixin类:

class MyViewMixin(object):
    def get_context_data(self, **kwargs):
        context = super(MyViewMixin, self).get_context_data(**kwargs)
        context['foo'] = 'bar'
        return context

class MyView1(MyViewMixin, DetailView):
    ...

class MyView2(MyViewMixin, ListView):
    ...

当需要将其添加到实际模板时,您可以让每个视图的模板继承自以某种方式实现foo上下文变量的模板。

如果它应该应用于每个视图,那么上下文处理器更合适,但如果它仅适用于少数几个视图,那么这两种方法将为您提供良好的服务。