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)

つまり、プロジェクトは異なる Tech オブジェクトを持つことができ、異なる技術オブジェクトは異なるプロジェクトに属することができます (プロジェクト X は Python と Django で作成され、プロジェクト 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'>

エラー。またtechsfieldsリストに追加しようとしましたが、それは

そのようなテーブルはありません: projects_project_techs

エラー。確認しましたが、projects_project_techsテーブルはありませんが、テーブルはありますprojects_tech。私のsyncdbで何かが台無しになったのでしょうか?

それが役立つ場合、私はデータベースとして Sqlite を使用しています。

4

3 に答える 3

3

TechInline クラスをインライン リストに追加しようとしましたが、

「TechInLine」が定義されていません

それはただのコピペですか?入力ミスのようです -TechInlineの代わりに試してくださいTechInLine

syncdb が適切なテーブルを作成しなかった場合は、手動で作成できます。次のコマンドを実行します。

python manage.py sqlreset <myapp>

そして、テーブルの定義を探しprojects_project_techsます。それをコピーして、データベースのクライアントに貼り付けます。

于 2008-10-02T04:48:29.987 に答える
0

@John Millikin - sqlreset のヒントをありがとう、正しい道に私を置きました。sqlreset が生成したコードは、projects_project_techsが実際には作成されていないことを示していました。結局、deb.db データベースを削除して再生成しました。techsその後、当然のように表示されました。

補足として、admin.site.register(Tech)プロジェクト ページからもクラスの新しいインスタンスを作成できるようにする必要がありました。

データベースを消去せずにモデルの変更を実装するためのより良い方法があるかどうかを確認するために、おそらく別の質問を投稿します (それが私の問題の原因であると確信しているため)。

于 2008-10-02T15:17:50.707 に答える
0

アプリが「projects」と呼ばれると仮定すると、techs テーブルのデフォルト名は projects_tech になり、projects テーブルは projects_project になります。

多対多テーブルは、projects_project_techs のようなものにする必要があります。

于 2008-10-02T09:27:51.517 に答える