2010-03-14 44 views
0

情景:具有許多第三方應用程序的大型項目。想要爲這些應用添加標籤,而無需修改應用的來源。Django:如何在不觸摸應用程序的源代碼的情況下動態地向第三方應用程序添加標記字段

我首先想到的是先指定settings.py模型列表(如['appname.modelname',],並呼籲他們每個人的Django標記的register功能寄存器功能增加了TagField和一個自定義的經理到指定的模型。這種做法的問題是功能需要運行之前生成的數據庫架構。

我試過直接在settings.py運行register功能,但我需要django.db.models.get_model擺脫隻字符串中的實際參考模型,和我似乎無法導入從settings.py - 無論我嘗試我得到一個ImportError。tagging.register功能導入OK然而。

因此,我改變了策略,並在空的應用程序中編寫了自定義管理命令。問題在於掛鉤到syncdb中的唯一信號是post_syncdb,這對我無用,因爲它在數據庫模式生成後觸發。

我現在唯一能想到的另一種方法是生成並運行一個類似於數據庫模式遷移的'南部'。這似乎更像是一種解決方案。

這似乎應該是一個相當普遍的需求,但我一直沒能找到一個乾淨的解決方案。

所以我的問題是:是否有可能動態地添加字段到模型生成之前,但更具體地說,是否有可能添加標籤到第三方模型,而不需要編輯它的源。爲了澄清,我知道可以在模型上沒有TagField的情況下創建和存儲標籤,但是這種方法存在一個主要缺陷,因爲很難同時創建和標記新模型。

回答

1

從文檔:

您不必爲了與標註使用它們 應用程序註冊您的模型 - 許多由註冊添加的功能 圍繞只是 更便利的包裝 標籤提供的Tag和 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()方法輕鬆完成,但問題的關鍵是避免修改應用程序。 – 2010-03-15 15:35:44

+0

您可以使用post_save信號完成此操作: http://docs.djangoproject.com/en/1.1/ref/signals/#django.db.models.signals。post_save – 2010-03-15 17:42:36

+0

我認爲你是在正確的軌道上 - 我一直在考慮使用post_save,但它有另一個問題。 post_save提供了三個參數:保存的類,實際的實例和一個布爾值,如果創建了新記錄,則爲True。沒有辦法訪問'request'對象,這是新標籤的地方。 – 2010-03-15 19:23:32

相關問題