Django管理站点未显示ManyToManyField关系

4
我正在处理一个我认为是标准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)。
然而,管理网站没有显示任何关于技术对象的用户界面。以下是我的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)

我尝试将 TechInline 类添加到 inlines 列表中,但这会导致一个问题。
<class 'home.projects.models.Tech'> has no ForeignKey to <class 'home.projects.models.Project'>

错误。还尝试将techs添加到fields列表中,但是会导致如下错误:

没有这个表:projects_project_techs

错误。我已经验证了,没有projects_project_techs表,但是有一个projects_tech表。也许我的syncdb出了些问题吗?
我正在使用Sqlite作为我的数据库,如果有帮助的话。

请查看我对 https://dev59.com/o3M_5IYBdhLWcg3wiDqA 的回答。 - A. Coady
3个回答

3

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

'TechInLine'未定义

这是直接复制粘贴吗?看起来你只是打错了 -- 请尝试使用TechInline而不是TechInLine

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

python manage.py sqlreset <myapp>

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


啊,我复制/粘贴得太糟糕了。我会编辑问题的。 - swilliams

0
假设你的应用程序叫做“projects”,那么技术表的默认名称将是projects_tech,项目表将是projects_project。
多对多关系的表应该类似于projects_project_techs。

0

@John Millikin - 感谢您的sqlreset提示,让我找到了正确的方向。 sqlreset生成的代码显示,projects_project_techs实际上从未被创建。最终,我只是删除了我的deb.db数据库并重新生成了它。然后techs就像应该出现的那样。

另外,我还需要执行admin.site.register(Tech)才能从Project页面创建类的新实例。

我可能会发布另一个问题,看看是否有更好的方法来实现模型更改(因为我相信这是导致我的问题的原因),而不必清除数据库。


生成的 SQL 代码可以直接复制到数据库客户端中。运行 "sqlite3 <mydatabase.db>",然后选择 "create table projects_project_techs..." 部分,将其复制并粘贴到 SQLite 提示符中。 - John Millikin
要实现模型更改,您想使用South。 - Aaron McMillin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接