Django视图:在基于类的视图中重用函数视图变量部分加载AJAX

时间:2016-12-29 11:53:34

标签: django django-templates

我有一个"主要"通过views.py中的函数视图查看服务器,该视图设置了很多变量。返回的模板使用了很多这些变量,还包括其中包含的模板以及使用AJAX加载的其他数据。

def season_view(request, id):
  # we do a bunch of stuff
  return render_to_response('season.html', {groups: groups, date: date, ...}

现在,在此模板中显示匹配列表。有很多匹配,所以使用AJAX分别加载它们,因此重复调用以下基于类的视图来加载匹配:

class GroupedMatches(TemplateView):
  template_name = 'partials/grouped_matches.html'

  def get_context_data(self, **kwargs):
    # stuff...
    context['matches'] = grouped_matches
    return context

然后grouped_matches.html循环遍历matches并包含匹配部分:

{% for match in matches }%
  {% include 'partials/match.html' %}
{% endfor %}

这就是事情:匹配部分不仅仅使用匹配本身所拥有的数据,而且还需要(出于任何目的)以前的一些变量,我们设置的groups season_view

问题在于,在不同视图中划分逻辑或使用AJAX似乎会丢失来自season_view的变量,即使匹配部分包含在" master"图。

为什么这些变量来自"更高"失去了?如何在部分中使用它们而不必再次计算它们?

1 个答案:

答案 0 :(得分:1)

调用GroupedMatches视图时,其上下文需要包含模板中所需的所有内容。如果您season_view()中还需要GroupedMatches中的代码,那么您需要提取该特定代码并在两个视图中使用它。

有几种选择:

选项:高级功能

创建一个高级函数,该函数返回一个字典,该字典将被添加到您需要的任何位置的上下文中。这可行,但可能看起来不像Django。我不会详细说明这个因为我更喜欢继承。见下文。

选项:继承

您还需要将season_view()更改为某个类,例如覆盖TemplateView的{​​{1}}。然后,您可以编写自己的Mixin,它提供get_context_data()的超级实现,包括所有继承视图共享的所有上下文属性。

get_context_data()