管理应用附带一个模型 - LogEntry。每次您在管理应用程序中执行某项操作时,都会有一些代码保存LogEntry。这就是应用程序的工作方式。例如在changeform_view 中有这样的内容:
def changeform_view(self, request, ...):
...
if request.method == "POST":
if all_valid(formsets) and form_validated:
# do some other stuff then
self.log_change(request, new_object, change_message)
def log_change(self, request, object, message):
"""
Log that an object has been successfully changed.
The default implementation creates an admin LogEntry object.
"""
from django.contrib.admin.models import CHANGE, LogEntry
return LogEntry.objects.log_action(
user_id=request.user.pk,
content_type_id=get_content_type_for_model(object).pk,
object_id=object.pk,
object_repr=str(object),
action_flag=CHANGE,
change_message=message,
)
LogEntry.objects.log_action 是创建日志的位置。不幸的是,这不会发生在其他任何地方,除非你要让它发生。
不过,没有什么能阻止你这样做。您可以在任何地方创建LogEntry。
话虽如此,这可能有点令人困惑,因为当您看到 LogEntry 时,您现在不再不知道这是由于有人通过管理应用程序手动更改某些数据而发生的更改,或者以编程方式发生。创建您自己的Log 模型并在您需要的时间和地点保存日志可能是一个更好的主意。
如果您愿意,您可以随时在相关管理视图中显示您的日志。像这样的东西可以解决问题:
class MyAdmin(admin.modelAdmin):
readonly_fields = (logs_field,)
def logs_field(self, instance):
logs = Log.objects.filter(object=instance)
return format_html_join(
'\n', "<p>{}: {}</p>",
((log.date, log.message) for log in logs)
)