Django - Для l oop дает результаты только для одного элемента - PullRequest
0 голосов
/ 04 августа 2020

У меня есть следующее 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_lemma и count, , но только для одной песни . Разве я не должен получать его для всех песен, поскольку он попадает под for l oop?

1 Ответ

1 голос
/ 04 августа 2020

Вы переопределяете значение с каждым l oop. Объявить список вне l oop.

Пример:

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'])}})
...