首页 > 解决方案 > Django ListView:'this_object_id'未定义

问题描述

当我想引用ListView.

我的看法:

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

    def get_context_data(self, **kwargs):
        context = super(SongList, self).get_context_data(**kwargs)
        user_flash = Flashcard.objects.filter(owner=self.request.user).values_list('question', flat=True)
        song = models.Song.objects.get(pk=this_object_id)  #works if hard-coded
        lyrics_list = models.Song.objects.get(song=song).lyrics_as_list()
        user_word = list(set(user_flash) & set(lyrics_list))
        context['percent_known'] = (len(user_word)/len(set((lyrics_list))))*100
        return context

我收到以下错误:name 'this_object_id' is not defined

我尝试了各种变化,但我不断收到错误,例如

self.kwargs['pk']
self.kwargs.get['pk']

然后我得到错误:KeyError 'pk'

当我对 pk 进行硬编码时它可以工作,所以问题不在我的代码的其他地方。当我在我的DetailView(使用self.kwargs['pk'])中执行此操作时它也有效,但我需要访问percent_known我的ListView. 我怎样才能做到这一点?我可以理解为什么它不起作用,ListView是一个对象列表,所以它不知道我想为哪个对象获取此信息......但必须有一种方法我可以为每个目的?还是有另一种方法可以访问percent_known每个对象?

标签: pythonpython-3.xdjangodjango-viewsdjango-listview

解决方案


这里的主要问题是get_context_data(),当您实际管理列表时,您尝试访问单个项目的信息的方法。

如果您要对列表中的每个对象执行一些困难的计算,则可以访问 中的这些对象get_context_data(),例如:

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

        for song in context['song_list']:
             # Here you already have the current Song object you want to process
             lyrics_list = models.Song.objects.get(song=song).lyrics_as_list()

             # and so on...
        
        return context

另一个更有效的选择是使用 Django ORM 系统执行此计算,在方法下注释Songs 列表get_queryset()


推荐阅读