我正在尝试将模型导入我的 Django 视图,然后查询所有对象、对它们进行排序并对其进行迭代。导入模型时没有收到任何错误,但是,当尝试使用查询模型时songs = song.objects.all()#.order_by('-release_date')
,我收到错误:
UnboundLocalError at /hotline/dbm
local variable 'song' referenced before assignment
/home/path/to/site/views.py, line 82, in dbm
songs = song.objects.all()#.order_by('-release_date')
我不明白问题是什么,因为变量song
显然是从我的models.py
文件中导入的,并且我在导入它时没有收到任何错误 - 那么为什么 Python 不能识别出song
我从文件中导入的内容models.py
?
我的models.py
文件:
class song(models.Model):
name = models.TextField()
file = models.FileField()
release_date = models.DateTimeField(default=timezone.now)
class Meta:
verbose_name = 'Song'
verbose_name_plural = f'{verbose_name}s'
我的views.py
文件:
#list of modules removed to keep code clean
from .models import *
@csrf_exempt
def dbm(request: HttpRequest) -> HttpResponse:
songs = song.objects.all()#.order_by('-release_date')
response = request.POST.get('Digits')
if response == None:
vr = VoiceResponse()
vr.say("Please choose a song, and then press pound")
vr.pause(length=1)
with vr.gather(finish_on_key='#', timeout=6, numDigits="1") as gather:
for song, num in songs:
gather.pause(length=1)
gather.say(f"For {song.name}, please press {num}")
vr.redirect(reverse('dbm'))
return HttpResponse(str(vr), content_type='text/xml')
elif response != None:
vr = VoiceResponse()
vr.say("hi")
return HttpResponse(str(vr), content_type='text/xml')
谢谢!
在您的代码中,小写的歌曲与类名冲突。
当您使用:
django导入song类,并且赋予一个本地名字song。
但是,解释器假设函数中的 song 指的是局部变量(而不是模型类),因为 for 循环会临时创建局部变量
在Django中,模型类应该遵循PascalCase命名约定。
模型.py:
视图.py
是的,但是在您的函数中您还使用了一个名为的局部变量
song
,事实上:这意味着 Python 认为这
song
是一个局部变量,因此它拒绝寻找函数外部的变量。但我认为主要问题是类通常是用 而
PascalCase
不是编写的,因此您最好重命名模型snake_case
Song
而不是。由于局部变量有song
snake_case
名称,因此可以避免冲突,因此:那么视图如下所示: