【问题标题】:Django - For loop gives results for only one itemDjango - For 循环只为一项提供结果
【发布时间】:2020-08-04 05:55:35
【问题描述】:

我有以下ListView

class SongList(generic.ListView):
    model = models.Song
    template_name = 'videos/song_list.html'
    context_object_name = 'song_list'

我在哪里覆盖get_context_data:

    def get_context_data(self, **kwargs):
        context = super(generic.ListView, self).get_context_data(**kwargs)

现在我想对每首歌曲执行一些操作,以便将其显示在我的模板上,所以我这样做了:

        for song in context['song_list']:
            song = models.Song.objects.get(title=song)
            lyrics_list = models.Song.objects.get(title=song).lyrics_as_list()
            
            import pymorphy2
            morph = pymorphy2.MorphAnalyzer()

            lyrics_list_lemma = []
            for word in set(lyrics_list):
                parsed_word = morph.parse(word)[0]
                result = {
                    'word_original': word,
                    'word_normalized': parsed_word.normal_form,
                        }
                lyrics_list_lemma.append(result)
            context['lyrics_lemma'] = lyrics_list_lemma
            context['count'] = len([k for d in lyrics_list_lemma for k in d.keys() if k == 'word_normalized'])
        return context

我得到了 lyrics_list_lemmacount 的正确值,但仅限于一首歌。我不应该为所有歌曲都获得它,因为它属于for 循环吗?

【问题讨论】:

  • 您是否尝试过调试和检查 context['song_list'] 的值?它可能被某些东西覆盖了。
  • 是的,我知道context[song_list] 给出了正确的值,因为它适用于我在同一视图中的其他功能

标签: python python-3.x django for-loop django-views


【解决方案1】:

您在每个循环中都覆盖了该值。在循环外声明列表。

例如:

context['lyrics_lemma'] = []
context['count'] = []
for song in context['song_list']:
    song = models.Song.objects.get(title=song)
    lyrics_list = models.Song.objects.get(title=song).lyrics_as_list()
    
    import pymorphy2
    morph = pymorphy2.MorphAnalyzer()

    lyrics_list_lemma = []
    for word in set(lyrics_list):
        parsed_word = morph.parse(word)[0]
        result = {
            'word_original': word,
            'word_normalized': parsed_word.normal_form,
                }
        lyrics_list_lemma.append(result)
    context['lyrics_lemma'].append(lyrics_list_lemma)
    context['count'].append(len([k for d in lyrics_list_lemma for k in d.keys() if k == 'word_normalized']))
return context

你可能还需要一本字典或字典列表

context['data'] = []
for song in context['song_list']:
    .....
    context['data'].append({"lyrics_lemma": lyrics_list_lemma, 
                            "count": len([k for d in lyrics_list_lemma for k in d.keys() if k == 'word_normalized']))

或者

context['data'] = {}
for song in context['song_list']:
    .....
    context['data'].update({song: {"lyrics_lemma": lyrics_list_lemma, 
                                   "count": len([k for d in lyrics_list_lemma for k in d.keys() if k == 'word_normalized'])}})

【讨论】:

    猜你喜欢
    • 2020-04-27
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-09
    相关资源
    最近更新 更多