【问题标题】:How to combine two views in django?如何在 django 中合并两个视图?
【发布时间】:2018-08-14 13:23:00
【问题描述】:

我想在视图中插入另一个视图。

基本上我使用 Django 过滤器包和值输出直接填充模板,而无需编写任何视图类。

我想在当前模板中插入另一个 html。 像这样的东西:{% include 'countsnippet' %},但这给了我错误模板不存在。

或者,我尝试使用{% include 'countsnippet.html' %},但这不会调用视图并且字段仍然为空。

我可以使用什么方法来包含另一个视图?

这是我的 countsn-p html。

{% block content %}
<p> INFT : {{ inft }} </p>
{% endblock %}

我已经为 countsn-p 做了视图,它的 url 看起来像这样:

url(r'countsnippet/$', countsnippet, name='countsnippet')

这是 countsn-p 视图的 sn-p:

 def countsnippet(request):
     checkins = Attendee.objects.filter(checkin=True)
     inft = Attendee.objects.filter(branch='INFT')
     cmpn = Attendee.objects.filter(branch='CMPN')
     mms = Attendee.objects.filter(branch='MMS')
     return render( request, 'search/countsnippet.html', {'inft': 
 (checkins&inft).count(), 'cmpn': (checkins&cmpn).count(), 'mms': 
 (checkins&mms).count()} )

【问题讨论】:

  • 我很确定在使用extend、include 和block 部分之间你可以完成你正在寻找的东西。
  • 我尝试过包含和阻止系统,但我无法找到方法。我也尝试过这里提到的实现(stackoverflow.com/questions/10608114/django-two-views-one-page),但我找不到适合我想要的方式。
  • 请列出我应该在countsnippet.html的上下文中声明哪些变量
  • 当然,count sn-p 视图返回一个字典,其中包含如下几个值:return render( request, 'countsnippet.html', {'inft': inft.count(), 'cmpn': cmpn.count(), 'extc': extc.count() }) 并且我的模板 sn-p 被提及。谢谢
  • 你确定` {'inft': inft.count(), 'cmpn': cmpn.count(), 'extc': extc.count() }` 在父视图中声明?

标签: django


【解决方案1】:

您不能将视图直接添加到模板中,因为它需要请求和上下文。我认为要解决您的问题,您有两种不同的选择:

1 使用包含标签

您可以使用包含标签将带有上下文的模板集成到另一个模板中,请参阅 django 文档:https://docs.djangoproject.com/en/2.1/howto/custom-template-tags/#inclusion-tags

2。在视图函数/类中使用包含的视图作为包装视图的上下文

您可以将您的“视图”(在本例中为带有上下文的生成模板)直接包含在包装视图的上下文字典中。你可以通过做类似的事情来实现这一点:

# views.py
from django.views.generic import TemplateView
from django.template import Context, Template

# Wrapper view
class WrapperView(TemplateView):
    """
    This is the wrapper view, you include the inline view inside the
    wrapper view get_context_data.
    """
    template_name = "wrapper_template.html"

    def get_context_data(self, **kwargs):
        context = super(WrapperView, self).get_context_data(**kwargs)

        inline_context = {
            'name': 'Steve'
        }
        inline_html_template = Template('inline_template.html')
        inline_view = html_template.render(Context(inline_context))

        context['inline_view'] = inline_view

        # In the wrapper template you can show the html of your inline_view with {{ inline_html|safe }}

        return context

否则你可以从这样的上下文中生成一个视图,但它需要一个请求对象:InlineView.as_view(add_context=context)(request),我不确定你以后如何将它嵌入到你的另一个视图中。

【讨论】:

  • 我不确定天气我是否理解你提到的内容,但我无法弄清楚我在哪里为我当前的父类添加数据。如果您能帮我弄清楚这一点,那就太好了。
  • 本例中可以添加inline_context字典中的数据,通过render函数传递给html_template。
  • @jayVasant,我用另一种可能性更新了这个问题,这可能更容易满足您的需求。
  • 但是Template('inline_template.html') 并没有按照你的意思做,我想。也许你的意思是get_template('inline_template.html')
猜你喜欢
  • 2019-11-14
  • 2020-09-18
  • 2015-11-05
  • 1970-01-01
  • 1970-01-01
  • 2019-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多