Django管理站点不显示ManyToManyField关系

时间:2008-10-02 04:43:29

标签: python django

我正在研究我认为非常标准的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)

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

但是,管理站点不显示Tech对象的任何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)

我已尝试将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作为我的数据库。

3 个答案:

答案 0 :(得分:2)

  

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

     

'TechInLine'未定义

这是一个直接的复制粘贴吗?看起来你刚刚输错了 - 尝试TechInline而不是TechInLine

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

python manage.py sqlreset <myapp>

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

答案 1 :(得分:0)

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

多对多表应该类似于projects_project_techs

答案 2 :(得分:0)

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

作为旁注,我必须做admin.site.register(Tech)才能从Project页面创建类的新实例。

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