向基于类的视图添加额外内容并对其进行过滤

Posted

技术标签:

【中文标题】向基于类的视图添加额外内容并对其进行过滤【英文标题】:Adding extra content to Class Based View and filtering it 【发布时间】:2018-05-01 09:08:02 【问题描述】:

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

我认为解决此问题的方法是在视图中添加一个过滤器,该过滤器基本上说“只拉入与这次巡演有关的比赛”,这是我在下面的 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'),

板球模型.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 %

【问题讨论】:

这里没有足够的信息。 CricketMonthlyViewTourMatch 如何相互关联?视图的 URL 模式是什么?不工作的 for 循环是什么样的? 我的错。我更新了我原来的帖子。 【参考方案1】:

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

或者,如果您可以访问上下文变量中的游览对象,则可以在模板中获取与 tour.match_set.all 匹配的匹配项

另外,请注意使用大写 T 命名上下文变量 Tour,因为这是模型的名称。

【讨论】:

tour.match_set.all 运行良好。非常感谢你。我还取消了上下文变量的大写。我仍然掌握 Python Shell 的窍门,我会阅读你提到的断点的东西,我认为现在我已经开始构建更大的项目,这会派上用场。非常感谢:) 很高兴能帮上忙。一些在未来节省时间的技巧——安装 ipython(python 的更漂亮的版本)和 ipdb(pdb 的更漂亮的版本)。我并不是说这是光顾,但如果你还没有完成整个 Django 教程,我强烈推荐它。 Django 有这么多内置实用程序,如果不阅读大量内容,很难知道该使用什么,但教程有很长的路要走。

以上是关于向基于类的视图添加额外内容并对其进行过滤的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何在函数视图中调用基于类的通用视图

Symfony2 和 Propel 包:向 Propel 参数转换器添加额外的过滤器

有没有办法在 Odoo 12 的树视图中的操作菜单中添加额外的操作?

从Django中基于类的通用视图向ModelForm发送request.user对象

如何向 symfony 2 表单添加一些额外的数据

向Google地图添加路况图层会产生额外费用吗?