Django: NameError: 名称 'Category' 未定义

0 投票
3 回答
10138 浏览
提问于 2025-04-16 00:30

我正在练习Django,并且在使用一些在线教程来搭建一个博客网站。第一个项目进展得很顺利,但当我尝试第二个项目时,在开发第一个视图的时候,出现了这样一句话:

categories = models.ManyToManyField(Category, related_name ="packages")

在教程中,验证模型时没有错误,但当我运行验证命令时却出现了:NameError: name 'Category' is not defined

我仔细检查了所有文件的语法,没有发现任何语法错误,教程中也没有提到需要额外的导入。

这到底是怎么回事呢?

3 个回答

0

我遇到了下面的错误:

NameError: name 'Category' is not defined

这个错误是因为我在定义 Category 类之前,就把它设置成了 ForeignKey(),就像下面这样:

class Product(models.Model):     # Error
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    name = models.CharField(max_length=50)

class Category(models.Model):
    name = models.CharField(max_length=50)

所以,我把 Category 设置成 ForeignKey() 的位置改到了 Category 类定义之后,如下所示,这样错误就解决了:

class Category(models.Model):
    name = models.CharField(max_length=50)

class Product(models.Model):     # Here
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    name = models.CharField(max_length=50)

或者,我可以把 Category 用引号包起来再设置成 ForeignKey(),如下所示,这样也能解决错误:

class Product(models.Model):   # ↓  Here  ↓
    category = models.ForeignKey("Category", on_delete=models.CASCADE)
    name = models.CharField(max_length=50)

class Category(models.Model):
    name = models.CharField(max_length=50)

*你可以查看 我的问题和回答,里面解释了在 Django 模型字段中,类名用引号和不用引号的区别,以及如何建立外键关系。

0

在这里提到的“某些”内容是很有用的。

不过,问题在于你没有导入Category,或者你在模型中定义的Category和提到的关键字不一致。

4

听起来你可能刚接触Python,因为你提到“我仔细检查了所有文件的语法,没有发现任何语法错误,教程中也没有提到额外的导入。”

要知道,在Python中,很多与名称相关的错误是在运行时被发现的,而不是像C++那样在编译时就能发现。这在我刚开始用Python的时候也让我有点困惑。运行时错误可能只是简单的拼写错误等等。(如果这听起来有点糟糕,不用担心——有免费的工具可以像编译器一样检查你的程序,找出其他语言可能会发现的问题)

Category这个名字是在你提到的那行代码所在的文件中定义的吗?

如果不是,你必须特别导入Category这个名字。假设Category是在另一个文件argh.py中定义的。

import argh

这样是不行的。

你需要这样做:

from argh import Category

(或者你可以改成argh.Category来引用)

总之,除非你提供更多信息,否则你的问题很难得到更好的回答。那行代码本身不是问题。问题可能出在Category的定义上。Category的定义在哪里?Category是另一个模型类。应该有类似这样的代码:

class Category:
     #....

而这段代码应该在同一个文件中,或者如果它在一个叫“prison.py”的文件中,那么你正在处理的文件应该包含:

from prison import Category

撰写回答