Программно создавать модели django

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

Недавно я обдумывал идею разрешить администратору создавать объект 'build_menu'.

В идеале нужно указать имя для ввода, и после создания меню будет иметь:

  • вызвать меню запуска django
  • скопировать views.py, models.py и admin.py из приложения меню, заменив имена классов на имена классов
  • добавить к urls.py, чтобы включить новые области для «меню»
  • добавить '.prefix_menu' к INSTALLED_APPS в settings.py
  • python manage.py syncdb
  • pkill python (на Dreamhost, поэтому мне нужно перезапустить процесс, чтобы увидеть новые изменения на экране)

Очевидно, что универсальной реализации, которая сделает это за меня, не существует, но более важный вопрос: возможно ли это? Можно ли записать эти команды в скрипт, чтобы сделать это со стороны сервера, и после создания нового объекта «build_menu» на сайте администратора django запустить этот скрипт, а затем обновить страницу, когда он завершится? Или это то, что я не смог бы сделать с сайта администратора?


person steve-gregory    schedule 27.01.2012    source источник
comment
Вероятно, вы могли бы написать такой скрипт для запуска из пользовательского представления, подключенного к сайту администратора. Но действительно ли это то, чем вы хотите заниматься? Я очень настоятельно рекомендую переработать вашу иерархию, чтобы такие вещи можно было делать из БД, а не изменять код со стороны сервера. (Если что-то пойдет не так — и с файловыми системами, и с веб-серверами, и с генерацией кода, и так далее, что угодно может пойти не так — вы потенциально нанесете вред всему сайту, пока кто-нибудь не войдет и не исправит все вручную.)   -  person Danica    schedule 27.01.2012
comment
Я согласен, я знаю, что это не лучший способ сделать это, но я пытаюсь понять, как изменить реализацию, чтобы она работала в стиле джанго.   -  person steve-gregory    schedule 28.01.2012


Ответы (2)


Один быстрый, хакерский способ заставить их отображаться отдельно в админке:

  • Создайте единую модель с атрибутом charfield type_name, как предложил Нед.
  • Добавьте type_name к атрибуту list_filter администратора модели.
  • Переопределить соответствующий шаблон, чтобы вывести список уникальных значения type_name со ссылкой на соответствующую страницу фильтра

У этого есть несколько довольно очевидных проблем (например, после сохранения объекта вы вернетесь на страницу редактирования без фильтров), но вы, вероятно, могли бы переопределить представление списка администратора и, возможно, некоторые другие функции администратора, чтобы делать то, что вы хотите, - без кода требуется переделка.

person Danica    schedule 28.01.2012
comment
Это то, что я искал, я не знал, как реализовать ответ Неда, чтобы получить то, что мне нужно, в интерфейсе администратора. Это позволяет мне сохранить всю функциональность без фактического дублирования кода, что является плохой практикой. Благодарю вас! - person steve-gregory; 29.01.2012

Может быть, я не понимаю, чего вы пытаетесь достичь, но мне кажется, что это не имеет особого смысла. Зачем копировать views.py и т. д., если они не изменены? У вас будет N копий одного и того же кода, в этом нет смысла. Похоже, вам нужна одна модель с дополнительным столбцом name, а не N моделей.

person Ned Batchelder    schedule 27.01.2012
comment
Я думаю, что это может сработать, но мне нужно, чтобы все таблицы с одинаковым именем были визуально разделены в интерфейсе администратора, возможно ли это? - person steve-gregory; 28.01.2012
comment
Зачем вам нужно, чтобы ваши пользователи использовали интерфейс администратора? - person Ned Batchelder; 28.01.2012
comment
Мне нужно создать совершенно новые меню со стороны администратора, в основном мне нужна та же структура базы данных, но без данных, чтобы можно было создать новое меню. - person steve-gregory; 28.01.2012