Django视图调用模型方法时出现NameError问题求助
解决模型实例方法调用的NameError问题
你遇到的问题根源很明确——你把Song类里的实例方法当成了全局函数直接调用,这是Python类方法调用的典型误区。
错误原因拆解
lyrics_as_list()能正常运行,是因为你通过Song的实例(models.Song.objects.get(...)返回的对象)去调用它;但sorted_strings你直接写成了全局函数的调用方式,Python会在当前全局命名空间里找这个函数,自然找不到,所以抛出name 'sorted_strings' is not defined。
快速修复方案
和调用lyrics_as_list()一样,通过你获取到的Song实例来调用sorted_strings:
# 先把实例存起来,避免重复查询 song = models.Song.objects.get(pk=self.kwargs['pk']) lyrics_list = song.lyrics_as_list() # 通过实例调用模型方法 lyrics_sorted = song.sorted_strings(set(lyrics_list), "ru_RU.UTF8")
更合理的优化(符合DRY与代码语义)
观察你的sorted_strings方法,它其实不需要依赖Song实例的任何属性(只用到传入的参数),这种情况下把它改成静态方法会更合适,这样不需要绑定到具体实例就能调用,逻辑也更清晰:
修改模型代码:
class Song(models.Model): # 你的字段定义... def lyrics_as_list(self): return self.lyrics_ru.split() @staticmethod def sorted_strings(strings, locale=None): if locale is None: return sorted(strings) collator = icu.Collator.createInstance(icu.Locale(locale)) return sorted(strings, key=collator.getSortKey)
然后在视图里可以直接通过Song类调用:
lyrics_list = models.Song.objects.get(pk=self.kwargs['pk']).lyrics_as_list() lyrics_sorted = models.Song.sorted_strings(set(lyrics_list), "ru_RU.UTF8")
这样既保持了代码的复用性(遵循DRY),又让方法的职责更明确——它是一个和俄语字符串排序相关的工具方法,归属在Song类下也符合业务逻辑。
内容的提问来源于stack exchange,提问作者MeL
相关产品推荐
相关产品推荐

