2011-12-22 23 views
2

所以我使用管理LogEntry對象/表在我的應用程序中記錄事件。我有一個視圖,我想顯示每個LogEntry。
如果我可以將LogEntry與它們表示的實際對象(因此我可以用日誌條目內聯顯示對象的屬性),這將是非常好的理論上,這應該很容易,因爲我們有模型類型和ID LogEntry但我無法弄清楚如何使用查詢集來加入它們。django - 將LogEntry加入實際模型

我想我可以抓住不同對象的所有ID併爲每個對象類型創建另一個字典,然後以某種方式加入它們(也許將這些列表壓縮在一起?)但是這看起來很笨,而且不是非常djano-ish/pythonic 。

有沒有人有更好的建議?

** 編輯 ** 只是想澄清我不想使用管理員,但滾動自定義視圖和模板。

回答

2

據我所知Django使用contenttypes framework在管理員中執行日誌記錄。因此,您應該在模型中創建泛型關係,然後在管理中使用GenericTabularInline和GenericStackedInline顯示內聯。請諮詢文章。

from django.contrib import admin 
from django.contrib.admin.models import LogEntry 
from django.contrib.contenttypes.generic import GenericTabularInline 
from django import forms 
from some_app import models 
from some_app.models import Item 

class LogForm(forms.ModelForm): 
    class Meta: 
     model = LogEntry 

class LogInline(GenericTabularInline): 
    ct_field = 'content_type' 
    ct_fk_field = 'object_id' 
    model = LogEntry 
    extra = 0 

class ItemForm(forms.ModelForm): 
    class Meta: 
     model = Item 

class ItemAdmin(admin.ModelAdmin): 
    form = ItemForm 
    inlines = [LogInline,] 


admin.site.register(models.Item, ItemAdmin) 

,並添加到項目:

class Item(models.Model): 
    name = models.CharField(max_length=100) 
    logs = generic.GenericRelation(LogEntry) 

這種變化不會在數據庫中創建任何東西,所以沒有必要同步

+0

很酷。我以前從未使用泛型關係。在我的情況下,那麼,你是否建議在我的模型中創建一個通用關係到logEntry對象? – 2011-12-22 19:23:46

+0

我已經用例子更新了我的答案。希望這可以幫助。 – Ilya 2011-12-23 00:09:28

+0

ahh感謝代碼示例。使事情更清晰。一些事情。 1st:我不想使用管理員。我想推出我自己的觀點和模板。 第二:這種方式給了我一個所有物品的清單,然後當看着一個特殊物品時,我看到了所有的日誌。我需要另一種方式。我需要一個日誌條目列表和每個項目的細節。這是相關的,因爲我執行的查詢是基於LogEntries,而不是項目。謝謝! – 2011-12-23 02:28:44

0

最近的Django版本需要創建一個代理對於LogEntry:

from django.contrib import admin 
from django.contrib.admin.models import LogEntry 
from django.contrib.contenttypes.generic import GenericTabularInline 

class LogEntryProxy(LogEntry): 
    content_object = GenericForeignKey('content_type', 'object_id') 
    class Meta: 
     proxy = True 

class LogInline(GenericTabularInline): 
    model = LogEntry 
    extra = 0 

class ItemAdmin(admin.ModelAdmin): 
    inlines = [LogInline,] 

admin.site.register(models.Item, ItemAdmin)