Django 管理站点不显示 ManyToManyField 关系

Django admin site not displaying ManyToManyField relationship

提问人:swilliams 提问时间:10/2/2008 最后编辑:John Millikinswilliams 更新时间:10/2/2008 访问量:5717

问:

我正在开发我认为非常标准的 django 站点,但无法让我的管理部分显示正确的字段。

这是我 models.py:

class Tech(models.Model):
    name = models.CharField(max_length = 30)

class Project(models.Model):
    title = models.CharField(max_length = 50)
    techs = models.ManyToManyField(Tech)

换句话说,一个项目可以有不同的技术对象,不同的技术对象可以属于不同的项目(项目 X 是用 Python 和 Django 创建的,项目 Y 是 C# 和 SQL Server)

但是,管理站点不显示技术对象的任何 UI。这是我 admin.py:

class TechInline(admin.TabularInline):
    model = Tech
    extra = 5

class ProjectAdmin(admin.ModelAdmin):
    fields = ['title']
    inlines = []
    list_display = ('title')

admin.site.register(Project, ProjectAdmin)

我尝试将类添加到列表中,但这会导致TechInlineinlines

<class 'home.projects.models.Tech'> has no ForeignKey to <class 'home.projects.models.Project'>

错误。还尝试添加到列表中,但这给出了一个techsfields

没有这样的表: projects_project_techs

错误。我验证了,没有表,但有一个。我的 syncdb 中是否搞砸了某些东西?projects_project_techsprojects_tech

如果有帮助,我正在使用 Sqlite 作为我的数据库。

蟒蛇 Django

评论

0赞 A. Coady 9/21/2009
看看我对 stackoverflow.com/questions/1339409 的回答

答:

3赞 John Millikin 10/2/2008 #1

我尝试将 TechInline 类添加到内联列表中,但这会导致

“TechInLine”未定义

这是直接复制粘贴吗?看起来你只是打错了字 - 尝试而不是.TechInlineTechInLine

如果您的 syncdb 没有创建正确的表,您可以手动创建。执行以下命令:

python manage.py sqlreset <myapp>

并查找表的定义。将其复制并粘贴到数据库的客户端中。projects_project_techs

评论

0赞 swilliams 10/2/2008
啊,那是我糟糕的复制/粘贴。我将编辑问题。
0赞 Andrew Ingram 10/2/2008 #2

假设您的应用名为“projects”,则 techs 表的默认名称将为 projects_tech,而 projects 表的默认名称将为 projects_project。

多对多表应类似于 projects_project_techs

0赞 swilliams 10/2/2008 #3

@John Millikin - 感谢您的 sqlreset 提示,它让我走上了正确的道路。sqlreset 生成的代码向我展示了从未实际创建过的代码。我最终只是删除了我的 deb.db 数据库并重新生成它。 然后照应出现。projects_project_techstechs

顺便说一句,我必须做一个才能从项目页面创建该类的新实例。admin.site.register(Tech)

我可能会发布另一个问题,看看是否有更好的方法来实现模型更改(因为我非常确定这就是导致我的问题的原因),而无需擦除数据库。

评论

0赞 John Millikin 10/3/2008
生成的 SQL 代码可以直接复制到数据库客户端中。运行“sqlite3 <mydatabase.db>”,然后选择“create table projects_project_techs...”部分,复制它,并将其粘贴到 SQLite 提示符中。
0赞 Aaron McMillin 11/23/2011
若要实现模型更改,请使用 South。