13

Django Adminで行ったすべての変更は、テーブルdjango_admin_tableに記録され、「最近のアクション」でも最新の変更を確認できます。

ただし、独自の「管理アクション」を作成して変更を加えると、デフォルトでは何もログに記録されません。

例:

def make_checked(modeladmin, request, queryset):
    queryset.update(checked = 1)
make_checked.short_description = 'Mark selected products as checked'

私の質問は、カスタム管理アクションをログに記録できるかどうかです。ログに記録できる場合は、どのようにしたらよいでしょうか。

4

3 に答える 3

23

管理者のLogEntryモデル、さらに重要なのはLogEntryManager。モデルマネージャーは、log_action独自のログエントリを簡単に追加できるメソッドを提供します(これはテストされていませんが、アイデアが得られるはずです)。

from django.contrib.admin.models import LogEntry, CHANGE
from django.contrib.contenttypes.models import ContentType

def make_checked(modeladmin, request, queryset):
    queryset.update(checked = 1)

    ct = ContentType.objects.get_for_model(queryset.model)
    for obj in queryset:
        LogEntry.objects.log_action(
            user_id=request.user.id, 
            content_type_id=ct.pk,
            object_id=obj.pk,
            object_repr=obj.description,
            action_flag=CHANGE,
            change_message="You have ...") 
make_checked.short_description = 'Mark selected products as checked'

通常のdjango管理者で使用されているロギングの例をいくつか見ることができます。クエリセット全体に1つだけ追加したい場合はLogEntry、手動で追加できます(log_entry上記では、個々のオブジェクトのログに合わせて調整された特定の引数のセットが必要です)。

l = LogEntry(user_id=request.user.id, actions_flag=CHANGE, change_message="...")
l.save()
于 2013-03-14T08:28:45.993 に答える
7

ModelAdminカスタムアクションの場合に実行できる利用可能なものがあれば、受け入れられた回答よりもはるかに簡単にこれを実行できるようになりました。

このModelAdminクラスは十分に文書化されていませんが、実際には次のメソッドをショートカットとして提供しています。

def log_addition(self, request, object, message):
    """
    Log that an object has been successfully added.

    The default implementation creates an admin LogEntry object.
    """

def log_change(self, request, object, message):
    """
    Log that an object has been successfully changed.

    The default implementation creates an admin LogEntry object.
    """

def log_deletion(self, request, object, object_repr):
    """
    Log that an object will be deleted. Note that this method must be
    called before the deletion.

    The default implementation creates an admin LogEntry object.
    """

これらは使いやすいです。質問の例を続けるには:

def make_checked(modeladmin, request, queryset):
    queryset.update(checked = 1)
    for obj in queryset:
        modeladmin.log_change(request, obj, 'Marked checked: ' + str(obj))
make_checked.short_description = 'Mark selected products as checked'
于 2019-06-21T14:17:42.137 に答える
1

ありがとう!いくつかの小さな変更の後、完璧に機能しました:

def make_checked(modeladmin, request, queryset):
    queryset.update(checked = 1)

    ct = ContentType.objects.get_for_model(queryset.model) # for_model --> get_for_model
    for obj in queryset:
        LogEntry.objects.log_action( # log_entry --> log_action
            user_id = request.user.id,
            content_type_id = ct.pk,
            object_id = obj.pk,
            object_repr = obj.title,
            action_flag = CHANGE, # actions_flag --> action_flag
            change_message = 'Changed checked.')
make_checked.short_description = 'Mark selected products as checked'
于 2013-03-14T18:04:10.687 に答える