Административный сайт Django не отображает отношения ManyToManyField - PullRequest
3 голосов
/ 02 октября 2008

Я работаю над тем, что я считаю довольно стандартным сайтом django, но мне не удается заставить мой раздел администратора отображать правильные поля.

Вот мои модели.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)

Однако сайт администратора не отображает никакой интерфейс для объектов Tech. Вот мой 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'>

Error. Также попытался добавить techs в список fields, но это дает

нет такой таблицы: projects_project_techs

Error. Я проверил, и нет таблицы projects_project_techs, но есть таблица projects_tech. Возможно, что-то напортачило в моем syncdb?

Я использую Sqlite в качестве базы данных, если это поможет.

Ответы [ 3 ]

2 голосов
/ 02 октября 2008

Я пытался добавить класс TechInline в список строк, но это вызывает

«TechInLine» не определено

Это прямая копия-паста? Похоже, вы только что сделали опечатку - попробуйте TechInline вместо TechInLine.

Если ваш syncdb не создал нужную таблицу, вы можете сделать это вручную. Выполните эту команду:

python manage.py sqlreset <myapp>

И найдите определение для таблицы projects_project_techs. Скопируйте и вставьте его в клиент для вашей базы данных.

0 голосов
/ 02 октября 2008

@ Джон Милликин - Спасибо за подсказку sqlreset, которая поставила меня на правильный путь. Sqlreset сгенерировал код, который показал мне, что projects_project_techs фактически никогда не создавался. В итоге я просто удалил свою базу данных deb.db и восстановил ее. techs тогда появился как надо.

И в качестве идентификатора я должен был сделать admin.site.register(Tech), чтобы иметь возможность создавать новые экземпляры класса и на странице проекта.

Вероятно, я опубликую еще один вопрос, чтобы узнать, есть ли лучший способ осуществить изменения модели (поскольку я почти уверен, что именно это и стало причиной моей проблемы) без очистки базы данных.

0 голосов
/ 02 октября 2008

Предполагая, что ваше приложение называется "проекты", по умолчанию имя вашей таблицы технологий будет projects_tech, а таблица проектов - projects_project.

Таблица «многие ко многим» должна выглядеть примерно как projects_project_techs

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...