Django模板无法获取Word模型pk的问题求助
解决Django词汇列表视图无法获取Word对象pk的问题
问题根源
你用values(language)查询时只指定了语言字段,返回的是仅包含该字段的字典集合,自然没有pk/id字段,导致模板里拿不到主键生成详情链接。
两种可行解决方案
方案1:在values()中显式包含pk字段
直接修改查询语句,把pk(或id)加入values()的参数列表,这样返回的字典里就会同时包含主键和目标语言字段:
class WordListByLanguageView(ListView): model = Word def get_queryset(self): language = self.kwargs.get('language') # 显式指定pk和目标语言字段 return Word.objects.values('pk', language)
模板里就能正常使用{{ word.pk }}生成详情链接,词汇内容用{{ word.[language] }}(比如language是'english'就用{{ word.english }})。
方案2:返回完整Word对象(更推荐)
放弃用values(),直接返回完整的Word实例,这样不仅能拿到pk,还能利用模型的其他属性或方法,扩展性更强:
class WordListByLanguageView(ListView): model = Word def get_queryset(self): # 可根据需求添加过滤条件,比如只返回当前用户的词汇 return Word.objects.all() def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # 把当前选中的语言传到模板 context['selected_language'] = self.kwargs.get('language') return context
然后在Word模型里加一个动态获取对应语言词汇的方法:
class Word(models.Model): # 假设你的字段是english、spanish这类多语言字段 english = models.CharField(max_length=100) spanish = models.CharField(max_length=100) # 其他字段... def get_language_word(self, language): # 安全获取对应语言的词汇,不存在则返回空字符串 return getattr(self, language, '')
模板里这样使用:
{% for word in object_list %} <a href="{{ selected_language }}/{{ word.pk }}"> {{ word.get_language_word(selected_language) }} </a> {% endfor %}
这种方式更符合Django的ORM使用习惯,后续扩展功能也更灵活。
内容的提问来源于stack exchange,提问作者KWunsch
相关产品推荐
相关产品推荐

