python - 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
每个对象?
解决方案
这里的主要问题是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 系统执行此计算,在方法下注释Song
s 列表get_queryset()
。
推荐阅读
- python - matplotlib饼图图形显示奇怪的图片
- php - 在导航栏中创建徽章并从控制器获取数据
- drag-and-drop - 代号一拖放 - 目标在拖动时更改背景颜色
- html - 基于正则表达式从排行榜 HTML 中提取纸质 URL
- flutter - 如何使用 Firestore 数据库快照填充表日历
- nginx - Nginx 反向代理 - 内部服务器由斜杠分隔
- file - 如何删除 MemoryStream 中的起始标头并将其余部分保存到文件中?
- sql - 使用 CROSS JOIN 添加额外的列
- java - java jpa hibernate在onetomany上回滚
- python - SQLAlchemy 切换到 python 多处理