将额外内容添加到 Class Based View 并过滤它

Adding extra content to Class Based View and filtering it

我在我的 HTML 模板中构建了一个 for 循环,它几乎可以工作了。我遇到的问题是它列出的比赛是不同巡演的一部分。

我认为解决这个问题的方法是在视图中添加一个过滤器,基本上说 "only pull in the matches to do with this tour" 这是我在下面的 Match.objects.filter() 中尝试做的,但它不起作用我不确定为什么。

class CricketCalendar(generic.ListView):
    template_name="monthly_view/cricket-monthly-view.html"
    context_object_name='cricket_monthly_view'
    queryset = CricketMonthlyView.objects.all()

    def get_context_data(self, **kwargs):
        context = super(CricketCalendar, self).get_context_data(**kwargs)
        context['Tour'] = Tour.objects.all()
        context['Match'] = Match.objects.filter(tour=self.request.Tour)
        return context

我也尝试了以下方法,但均无效:

self.kwargs['pk']
self.kwargs['Tour']

编辑,忘记添加以下内容:

月度视图 models.py:

class CricketMonthlyView(models.Model):
    tour = models.ForeignKey('cricket.Tour', on_delete=models.CASCADE, 
related_name='tour_name')
    match_id = models.ForeignKey('cricket.Match', on_delete=models.CASCADE)

和 URLs.py:

url(r'^monthly-view/$', monthly_view.CricketCalendar.as_view(), name='cricket-monthly'),

板球 models.py:

class Tour(models.Model):
    name = models.CharField(max_length=200)
    tier_level = models.ForeignKey('sports.Tier')
    country = CountryField()
class Match(models.Model):
    tour = models.ForeignKey('Tour', on_delete=models.CASCADE)

和 HTML 模板:

{% for match_info in cricket_monthly_view %}
 {% for tour in Tour %}
<ul>
  <li>{{tour.name}}</li>
</ul>
{% for match in Match %}
  <ul>
    <li>{{match.home_team}}</li>
    <li>{{match.away_team}}</li>
  </ul>
{% endfor %}
{% endfor %}

{% endfor %}

这是添加断点的好地方。您非常想了解您的上下文和您自己的字段。在 get_context_data 中添加 import pdb; pdb.set_trace(),您将能够看到对象上的字段。使用 dir(obj)obj.keys() 以查看某物的所有字段。

或者,如果您可以访问上下文变量中的旅游对象,您可以在模板中获得与 tour.match_set.all

匹配的匹配项

此外,在使用大写字母 T 命名上下文变量 Tour 时要小心,因为这是您的模型的名称。