Django ListView: 'this_object_id' 未定义
Django ListView: 'this_object_id' is not defined
当我想引用 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']
)中执行此操作时它也有效,但我需要为 ListView
中的每个对象访问 percent_known
。我怎样才能做到这一点?我可以理解为什么它不起作用,ListView
用于对象列表,所以它不知道我想为哪个对象获取此信息......但必须有一种方法我可以为每个对象做吗?还是有另一种方法可以访问每个对象的 percent_known
?
这里的主要问题是,在 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 系统执行此计算,annotating get_queryset()
方法下的 Song
s 列表。
当我想引用 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']
)中执行此操作时它也有效,但我需要为 ListView
中的每个对象访问 percent_known
。我怎样才能做到这一点?我可以理解为什么它不起作用,ListView
用于对象列表,所以它不知道我想为哪个对象获取此信息......但必须有一种方法我可以为每个对象做吗?还是有另一种方法可以访问每个对象的 percent_known
?
这里的主要问题是,在 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 系统执行此计算,annotating get_queryset()
方法下的 Song
s 列表。