使用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
答案 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 %}