最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django利用LogEntry生成歷史操作實戰(zhàn)記錄

 更新時間:2021年12月22日 11:02:17   作者:Tsissan's?Blog  
LogEntry是在后臺開發(fā)中經(jīng)常用到的模塊,它在admin是默認開啟的。文中給大家介紹了在admin頁面上查看操作日志的方法及實戰(zhàn)代碼,感興趣的朋友跟隨小編一起看看吧

在開發(fā)測試平臺的時候,雖然對某些關(guān)鍵功能做了權(quán)限設(shè)置,但畢竟是公司多人使用,有些數(shù)據(jù)的配置可能不小心被他人修改但未告知其他使用者,造成了諸多不便。所以決定開發(fā)一個操作歷史表,可以方便查看數(shù)據(jù)地改動。
LogEntry是在后臺開發(fā)中經(jīng)常用到的模塊,它在admin是默認開啟的。
可以使用LogEntry模塊記錄所有用戶的操作記錄。一方面可以用來監(jiān)督,另一方面可以用來做回滾。

使用LogEntry

ModelAdmin本身就有日志記錄功能。當新建一個實體(Post、Category、Tag)時,ModelAdmin會創(chuàng)建一條變更日志記錄。當修改一條內(nèi)容時,ModelAdmin又會調(diào)用LogEntry來創(chuàng)建一條日志,記錄這個變更。
ModelAdmin內(nèi)部提供了兩個方法,分別是log_addition和log_change。
log_addition記錄新增日志。
log_change記錄變更日志。
log_deletion記錄刪除日志。
我們可以看它們的定義來學習LogEntry模塊
代碼位置:Lib\site-packages\django\contrib\admin\options.py

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

    The default implementation creates an admin LogEntry object.
    """
    from django.contrib.admin.models import LogEntry, ADDITION
    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=ADDITION,
        change_message=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 LogEntry, CHANGE
    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,
    )


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.
    """
    from django.contrib.admin.models import LogEntry, DELETION
    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=object_repr,
        action_flag=DELETION,
    )

從以上代碼可以看出:這兩個方法都調(diào)用了LogEntry.objects.log_action方法,只是參數(shù)略有不同,可以看到,如果需要自定義變更記錄的話,只需要傳遞對應(yīng)的參數(shù)即可。以下簡要介紹一下這些參數(shù)。

  • user_id:當前用戶id
  • content_type_id:要保存內(nèi)容的類型,上面的代碼中使用的是get_.content_type_for_model方法拿到對應(yīng)Model的類型id。這可以簡單理解為ContentType為每個Model定義了一個類型id
  • object_id:記錄變更實例的id
  • object_repr:實例的展示名稱,可以簡單理解為我們定義的__str__所返回的內(nèi)容
  • action_flag:操作標記。admin的Model里面定義了幾種基礎(chǔ)的標記: ADDITION、CHANGE和DELETION。它用來標記當前參數(shù)是數(shù)據(jù)變更、新增,還是刪除。
  • change_message:這是記錄的消息,可以自行定義。我們可以把新添加的內(nèi)容放進去(必要時可以通過這里來恢復(fù)),也可以把新舊內(nèi)容的區(qū)別放進去。

理解了這幾個參數(shù),如果遇到類似的需求,就能直接使用Django現(xiàn)成的工具來完成了。

查詢某個對象的變更

上面我們知道如何記錄某個對象的變更日志了,那么問題來了,如何在詢已經(jīng)記錄的變更呢?
其實這是簡單的Model查詢問題。假設(shè)我們記錄的對象是Post的操作,現(xiàn)在來獲取Post中id為1的所有變更日志,大概代碼如下:

from django.contrib.admin.models import LogEntry, CHANGE
from django.contrib.admin.options import get_content_type_for_model

post = Post.objects.get(id=1)
log_entries = LogEntry.objects.filter(
    content_type_id=get_content_type_for_model(post).id,
    object_id=post.id)

這樣我們就拿到了id為1的所有變更記錄了。

在admin頁面上查看操作日志

我們既知道如何記錄變更日志,也知道如何獲取變更日志,那么如何才能夠在admin后臺方便地查看操作日志呢?
新增如下配置(admin.py):

#最上面增加import
from django.contrib.admin.models import LogEntry
#文件最下方增加
@adnin.register(LogEntry, site=custom_site)
class LogEntryAdmin(admin.ModelAdmin):
    list_display = ['object_repr','object_ id','action_flag','user','change_message']

這樣就可以看到所有的變更記錄了。如下圖所示:

實戰(zhàn)

雖然操作歷史顯示出來了,但是在django自帶的admin后臺才能看到,不是所有人都有進入admin后臺權(quán)限,能不能有一種方法能在前端展示出來讓每個人都可以查看呢?
前端代碼:

<table class="table table-bordered" style="width: 60%;margin-left: 20%;text-align: center"> 
   <caption style="text-align: center">
    <span style="font-size: large;color: black">項目:【<span style="color: pink">{{ client.name }}</span>】的操作記錄: </span>
   </caption> 
   <thead> 
    <tr style="background-color: #cdd8e5"> 
     <th style="width: 100px;text-align: center">操作時間</th> 
     <th style="width: 200px;text-align: center">操作對象</th> 
     <th style="width: 50px;text-align: center">對象id</th> 
     <th style="width: 100px;text-align: center">動作標志</th> 
     <th style="width: 100px;text-align: center">操作用戶</th> 
     <th style="width: 300px;text-align: center">修改內(nèi)容</th> 
    </tr> 
   </thead> 
   <tbody>
     {% for i in objects %} 
    <tr> 
     <td>{{ i.action_time }}</td> 
     <td>{{ i.object_repr }}</td> 
     <td>{{ i.object_id }}</td> 
     <td>{{ i.get_action_flag_display }}</td> 
     <td>{{ i.user }}</td> 
     <td>{{ i.change_message }}</td> 
    </tr> {% endfor %} 
   </tbody> 
  </table>

這里有個坑,如果就利用{{i.action_flag}}獲取操作標記的話,得到的是索引值,經(jīng)過stackoverflow.com查閱,需要利用Django-doc(用您要在其文本表示形式中“翻譯”的字段名稱替換)來獲取相應(yīng)值,因此:get_fieldname_display,所以這里要寫成{{ i.get_action_flag_display }}

后端代碼(views.py):

# 導(dǎo)入所需的包
from django.contrib.admin.models import LogEntry, CHANGE, ADDITION, DELETION
from django.contrib.admin.options import get_content_type_for_model

res = dict()
res['objects'] = LogEntry.objects.all()  # 獲取到所有操作歷史
# 只需要調(diào)用LogEntry.objects.log_action方法帶入所需參數(shù)即可
LogEntry.objects.log_action(
        user_id=request.user.pk,  # 操作用戶的id
        content_type_id=get_content_type_for_model(object).pk,  # 對應(yīng)數(shù)據(jù)庫Model的id
        object_id=object.pk,  # 操作對象的id
        object_repr=object_repr,  # 操作對象的名字
        action_flag=DELETION,  # ADDITION、CHANGE和DELETION三種方式選擇合適的
        change_message=''  # 自定義消息,可以放入修改之后的數(shù)據(jù)
    )

實現(xiàn)效果

參考資料:https://www.cnblogs.com/zihao1037/p/11057341.html

到此這篇關(guān)于Django利用LogEntry生成歷史操作的文章就介紹到這了,更多相關(guān)Django歷史操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于Python進行年齡和性別檢測

    基于Python進行年齡和性別檢測

    這篇文章主要介紹了通過Python 編程語言帶您完成使用機器學習進行年齡和性別檢測的任務(wù)。文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2021-12-12
  • python logging類庫使用例子

    python logging類庫使用例子

    這篇文章主要介紹了python logging類庫使用例子,本文講解了簡單使用、logging的level、Handlers、FileHandler + StreamHandler等內(nèi)容,需要的朋友可以參考下
    2014-11-11
  • 巧妙使用python?opencv庫玩轉(zhuǎn)視頻幀率

    巧妙使用python?opencv庫玩轉(zhuǎn)視頻幀率

    這篇文章主要介紹了巧妙使用python?opencv庫玩轉(zhuǎn)視頻幀率的教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-04-04
  • Python代理抓取并驗證使用多線程實現(xiàn)

    Python代理抓取并驗證使用多線程實現(xiàn)

    這里沒有使用隊列只是采用多線程分發(fā)對代理量不大的網(wǎng)頁還行但是幾百幾千性能就很差了,感興趣的朋友可以了解下,希望對你有所幫助
    2013-05-05
  • 在Python中使用zlib模塊進行數(shù)據(jù)壓縮的教程

    在Python中使用zlib模塊進行數(shù)據(jù)壓縮的教程

    這篇文章主要介紹了在Python中使用zlib模塊進行數(shù)據(jù)壓縮的教程,是Python入門學習中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-06-06
  • python實現(xiàn)ROA算子邊緣檢測算法

    python實現(xiàn)ROA算子邊緣檢測算法

    這篇文章主要為大家詳細介紹了python實現(xiàn)ROA算子邊緣檢測算法,以光學圖像為例,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • Python 實用技巧之利用Shell通配符做字符串匹配

    Python 實用技巧之利用Shell通配符做字符串匹配

    這篇文章主要介紹了Python 實用技巧之利用Shell通配符做字符串匹配的方法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • PyCharm基礎(chǔ)調(diào)試的教程

    PyCharm基礎(chǔ)調(diào)試的教程

    PyCharm作為Python開發(fā)的集成環(huán)境,提供了全面的調(diào)試工具,文中通過圖文及示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-11-11
  • Python PIL圖片如何按比例裁剪

    Python PIL圖片如何按比例裁剪

    這篇文章主要介紹了Python PIL圖片如何按比例裁剪,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Python3使用requests登錄人人影視網(wǎng)站的方法

    Python3使用requests登錄人人影視網(wǎng)站的方法

    通過本文給大家介紹python代碼實現(xiàn)使用requests登錄網(wǎng)站的過程。非常具有參考價值,感興趣的朋友一起學習吧
    2016-05-05

最新評論

岑巩县| 永宁县| 荆门市| 望城县| 沁源县| 全州县| 宜春市| 定日县| 酒泉市| 黄骅市| 兴国县| 宜丰县| 淮滨县| 定襄县| 方正县| 沙坪坝区| 固镇县| 德格县| 娄底市| 梁山县| 南江县| 青冈县| 武川县| 滦南县| 甘泉县| 吉安县| 民和| 理塘县| 漠河县| 青海省| 马边| 南平市| 平乡县| 宁都县| 秀山| 天门市| 平原县| 杭锦后旗| 小金县| 都匀市| 灵石县|