2010-03-14 2 views
0

Сценарий: большой проект со многими сторонними приложениями. Хотите добавить теги к этим приложениям без необходимости изменять источник приложений.Django: Как динамически добавить поле тега в сторонние приложения, не касаясь исходного кода приложения

Моя первая мысль была первым указать список моделей settings.py (как ['appname.modelname',] и вызовите функцию register Джанго-маркировать на каждой из них. Функция регистра добавляет TagField и пользовательский менеджер по указанной модели. проблема с этим подходом является то, что функция должна работать дО схема DB генерируется.

Я попытался запустить функцию register непосредственно в settings.py, но мне нужно django.db.models.get_model, чтобы получить реальную ссылку модели из только строк, и я не может показаться импортированным из settings.py - независимо от того, что я пытаюсь получить, я получаю ImportError. Функция tagging.register импортирует ОК.

Итак, я изменил тактику и написал пользовательскую команду управления в противном случае пустым приложением. Проблема в том, что единственный сигнал, который подключается к syncdb, равен post_syncdb, что бесполезно для меня с тех пор, как он запускается после создания схемы БД.

Единственный другой подход, о котором я могу думать в настоящий момент, состоит в том, чтобы генерировать и запускать миграцию схемы «на юг». Это похоже на взлом, а не на решение.

Кажется, что это должно быть довольно распространенной потребностью, но я не смог найти чистого решения.

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

Чтобы уточнить, я знаю, что можно создавать и хранить теги, не имея TagField для модели, но есть большой недостаток в этом подходе, поскольку трудно одновременно создать и пометить новую модель.

ответ

1

Из документов:

Вы не должны зарегистрировать свои модели для того, чтобы использовать их с мечения приложения - многие из особенностей добавленных регистрации просто удобство обертками вокруг Tagging API, предоставленный тегом и Модели TaggedItem и их менеджеры, , как описано ниже.

Ознакомьтесь с документацией по API и примерами, которые следуют за тем, как вы можете добавлять теги к любому произвольному объекту в системе.

http://api.rst2a.com/1.0/rst2/html?uri=http://django-tagging.googlecode.com/svn/trunk/docs/overview.txt#tags

Обновлено

#views.py 
def tag_model_view(request, model_id): 
    instance_to_tag = SomeModel.objects.get(pk=model_id) 
    setattr(instance_to_tag, 'tags_for_instance', request.POST['tags']) 
    ... 
    instance_to_tag.save() 
    ...returns response 

#models.py 
#this is the post_save signal receiver 
def tagging_post_save_handler(sender, instance, created): 
    if hasattr(instance, 'tags_for_instance'): 
     Tag.objects.update_tags(instance, instance.tags_for_instance) 
+0

Да, конечно. Но где код для добавления тегов? Мне нужно добавить теги сразу после сохранения объекта - очевидно, что это можно сделать легко, переопределив метод save() объекта, но проблема заключается в том, чтобы избежать изменения приложения. –

+0

Сигнал post_save можно использовать для: http://docs.djangoproject.com/en/1.1/ref/signals/#django.db.models.signals.post_save –

+0

Я думаю, что вы на правильном пути - я рассматриваю возможность использования post_save, но у него есть другая проблема. post_save предоставляет три аргумента: Сохраняемый класс, фактический экземпляр и логическое значение, которое является Истинным, если создается новая запись. Невозможно получить доступ к объекту 'request', где находятся новые теги. –