【问题标题】:Django _set.all filter not working in templateDjango _set.all 过滤器在模板中不起作用
【发布时间】:2018-05-04 02:51:36
【问题描述】:

我正在尝试过滤我的数据库中的对象列表,但我无法让它在使用_set.all 的模板上工作。奇怪的是,这是我在项目的其他两个地方做过的事情,但我不明白为什么这次它不起作用。

view.py:

class GolfMonthlyView(generic.ListView):
    template_name="monthly_view/golf-monthly-view.html"
    context_object_name='golf_monthly_view'
    queryset = GolfMonthlyView.objects.all()

    def get_context_data(self, **kwargs):
        context = super(GolfMonthlyView, self).get_context_data(**kwargs)
        context['golftour'] = golf_models.Tour.objects.all()
        context['golftournament'] = golf_models.Tournament.objects.all()

型号:

class Tour(models.Model):
    name = models.CharField(max_length=100)

class Tournament(models.Model):
    tour = models.ForeignKey('Tour', on_delete=models.CASCADE)
    name = models.CharField(max_length=100)

模板 html:

{% for info in golf_monthly_view %}
 {% for competition in golftour %}
    {% for golftournament in golftour.golftournament_set.all %}
      <ul>
        <li>{{golftournament.name}}</li>
      </ul>
   {% endfor %}
 {% endfor %}
{% endfor %}

所有这一切的好消息是试图解决我的问题,它迫使我第一次正确使用 Django Shell。所以我知道这种关系是存在的并且是有效的,它只是没有显示在模板中。

编辑:工作的东西:

class RugbyMonthlyView(generic.ListView):
    template_name="monthly_view/rugby-monthly-view.html"
    context_object_name='rugby_monthly_view'
    queryset = RugbyMonthlyView.objects.all()

    def get_context_data(self, **kwargs):
       context = super(RugbyMonthlyView, self).get_context_data(**kwargs)
       context['competition'] = rugby_models.Competition.objects.all()
       context['match'] = rugby_models.Match.objects.all()
       return context

model.py:

class Competition(models.Model):
name = models.CharField(max_length=200)

class Match(models.Model):
    competition = models.ForeignKey('Competition', on_delete=models.CASCADE)

html模板:

{% for match_info in rugby_monthly_view %}
 {% for competition in competition %}
  *code*
  {% for match in competition.match_set.all %}
   *code*
  {% endfor %}
 {% endfor %}
{% endfor %}

【问题讨论】:

    标签: python django django-templates django-class-based-views django-template-filters


    【解决方案1】:

    您将golftour.golftournament_set.all 嵌套在上下文列表golf_monthly_view 的循环中(不知道为什么要这样做),我认为这是空的,因为 ListView QuerySet 错误:

    queryset = GolfMonthlyView.objects.all()
    #          ^^^^ ?? This is not a model
    

    例如,如果您取消了外部 for 循环,如果 QuerySet 不为空,则内部循环应该继续:

    {% for competition in golftour %}
        {% for golftournament in golftour.tournament_set.all %}
          <ul>
            <li>{{golftournament.name}}</li>
          </ul>
        {% endfor %}
    {% endfor %}
    

    【讨论】:

    • 有点乱,但 GolfMonthlyView 是项目其他地方需要的另一个模型。其他两个模型也一样,因此会造成混淆。
    • @JordanLashmar 好吧,当前范围内的一个是列表视图,因此您要么必须以别名导入模型,要么更改其中一个名称。
    • 我已将 GolfMonthlyView 模型导入为 GolfView,我应该首先这样做,所以感谢您指出这一点。 :) 我可以自己循环遍历“golftournament”,当放置在“golftour”循环内时也可以。尝试循环遍历“golftour.golftournament_set.all”时会出现问题。不确定这是否有助于确定这一点?
    • @JordanLashmar 您似乎将tournament_setgolftournament 混淆了,golftournament 是一个单独的上下文变量,在这里似乎没有必要。更新了我的答案。
    • 我想我一定是。我当然混淆了一些东西。我刚刚添加了一个工作示例。在过去的几个小时里,我一直在比较和对比两者。
    猜你喜欢
    • 2021-06-16
    • 2014-09-28
    • 2015-06-18
    • 2016-05-20
    • 2011-03-29
    • 2013-02-24
    • 2020-03-07
    • 2023-03-07
    相关资源
    最近更新 更多