Django ListView 动态上下文数据

Django ListView dynamic context data

鉴于我的模型:

class Deck(models.Model):
   owner = models.ForeignKey(User, on_delete=models.CASCADE)
   name = models.CharField(max_length=255)

class Flashcard(models.Model):
   owner = models.ForeignKey(User, on_delete=models.CASCADE)
   deck = models.ForeignKey(Deck, on_delete=models.CASCADE)
   question = models.TextField()
   answer = models.TextField()

在我的 html 模板中,我想要一个 table 所有用户的牌组,每个牌组都有他们的牌数,例如像这样:

Deck1: 15
甲板 2:22
甲板 3:100

在我看来我有:

def get_context_data(self,**kwargs):
    context=super(generic.ListView,self).get_context_data(**kwargs)
    context['number_decks']=Deck.objects.filter(owner=self.request.user).count
    context['number_cards']=Flashcard.objects.filter(owner=self.request.user,deck__name="Deck1").count

number_decks 按预期工作。 number_cards 在我手动输入名称时也有效。 但是如果不指定名称,我怎么能做到这一点,所以在 html 模板中我只能说:

{% for deck in deck_list %}
      <td>{{deck.name}}</td>
      <td>{{number_cards}}</td>
{% endfor %}

而且因为我不知道用户将创建的牌组的名称。

我试过 deck__id=deck.id,但我得到零。

如何更改我的模型或视图以获得我想要的?

你可以把它写成你的 Deck-Model 的函数:

class Deck(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=255)

    def count_flashcards(self):
       fc = Flashcard.objects.filter(deck=self).count()
       return fc

在您的模板中:

{% for deck in deck_list %}
  <td>{{deck.name}}</td>
  <td>{{deck.count_flashcards}}</td>
{% endfor %}

您可能还想在这里使用缓存属性装饰器