django - присоединение LogEntry к актуальным моделям - PullRequest
2 голосов
/ 22 декабря 2011

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

Я думал, что могу просто получить все идентификаторы различных объектов.и создайте другой словарь для каждого типа объекта, а затем как-нибудь соедините их (может быть, объедините списки вместе?), но это кажется глупым и не очень djano-ish / pythonic.

у кого-нибудь есть лучшие предложения?

** edit ** просто хочу уточнить, я не собираюсь использовать admin, но накатить пользовательский вид и шаблон.

Ответы [ 2 ]

2 голосов
/ 22 декабря 2011

Как я знаю, 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)

, и вы добавите в Item:

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

это изменение не создаст ничего в вашей базе данных, поэтому нет необходимости синхронизировать

0 голосов
/ 01 марта 2015

Последние версии 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)
...