Django:在另一个中呈现TemplateView

时间:2018-06-04 14:44:24

标签: django

使用Django,我有多个模板文件(A,B和C),可以在名为GenericView的同一个TemplateView中呈现。

A,B和C使用相同的View(让我们称之为DynamicView),因此我需要从GenericView的get_context_data`中调用此DynamicView的呈现方法。

有没有办法可以在GenericView的模板中轻松呈现DynamicView的模板?

编辑:我正在使用基于类的视图编码

编辑:添加了一些代码以使我的问题更加清晰:

这是我的GenericView:

class GenericView(DetailView):
    model = SimpleModel
    template_name = "template.html"

    def get_context_data(self, **kwargs):
        context = super(GenericView, self).get_context_data(**kwargs)
        tests = DynamicModel.objects.filter(test=context['object'].pk)
        context['tests'] = tests
        print("tests : ", tests[0]) # each test contains a field called "template_path", I would like to instanciate a DynamicView so that I can include the rendered page in context
        return context

class DynamicView(TemplateView):
    template_name = "dummy.html"
    model = DynamicModel

    def render_to_response(self, context, **kwargs):
        absolute_path = get_object_or_404(DynamicModel, pk=self.kwargs['pk'])
        page = render(self.request, absolute_path, context, content_type=None, status=None, using=None) # here the page is rendered

2 个答案:

答案 0 :(得分:0)

您可以覆盖DynamicView' get_template_names方法。

在此之前,在决定要渲染的模板时会考虑什么?最好制作3个不同的视图,使用继承让它们共享代码,而不是重做任何视图路由。

答案 1 :(得分:0)

是的,可以使用Django template tag.来完成。您需要在此标记内调用render函数并将其放在所需模板中。

代码更新后编辑。

from django import template
from django.shortcuts import get_object_or_404
from myapp.models import DynamicModel

register = template.Library()


@register.inclusion_tag('dummy.html', takes_context=True)
def render_dynamic_model(context, **kwargs):
    absolute_path = get_object_or_404(DynamicModel, pk=kwargs['pk'])

    return {
       'absolute_path': absolute_path,
    }

并将其放入模板template.html

{% render_dynamic_model pk %}

这段代码就像一般的想法,如果您需要一些来自请求的变量,您可以在模板中传递它并分别更新模板标记代码。

{% render_dynamic_model pk request.user %}