【问题标题】:django-simple-history, displaying changed fields in admindjango-simple-history,在管理员中显示更改的字段
【发布时间】:2017-10-23 15:15:29
【问题描述】:

当我从 admin.ModelAdmin 继承时,在管理页面的历史记录中,我可以看到哪些字段已更改。但是,现在我需要使用 django-simple-history 来跟踪我所有的模型更改。现在,对于管理员,我继承了 simple_history.SimpleHistoryAdmin。虽然我可以看到所有模型更改并还原它们,但我看不到哪些字段已更改。是否可以将这种方便的功能添加到 SimpleHistoryAdmin 中?

【问题讨论】:

    标签: python django django-simple-history


    【解决方案1】:

    您需要的是管理员中的history_list_display 字段。 history_list_display 中包含的字段列表将显示在历史页​​面及其相应条目中。

    类似这样的:

    class SomeAdmin(admin.ModelAdmin):
    
        def some_user_defined(self, obj):
            return "something"
    
        date_hierarchy = 'created_at'
        search_fields = ['field1', 'field2']
        list_display = ('field1', 'field2',)
        list_filter = ('field1',)
        history_list_display = ('field1', 'field2', 'some_user_defined',)
    

    这将显示field1field2 以及commentuserreason

    【讨论】:

      【解决方案2】:

      我找到了解决此问题的方法。我添加了一个 ModelAdmin 方法并使用 History Diffing 在 Change history 表中添加了一个自定义字段。

      history_list_display = ['changed_fields']
      
      def changed_fields(self, obj):
          if obj.prev_record:
              delta = obj.diff_against(obj.prev_record)
              return delta.changed_fields
          return None
      

      【讨论】:

        【解决方案3】:

        如果您不仅要查看根据 Rafi 注释更改的字段的名称以及更改的值,则下一个代码将执行此操作:

        def changed_fields_with_values(self, obj):
            fields = ""
            if obj.prev_record:
                delta = obj.diff_against(obj.prev_record)
        
                for change in delta.changes:
                    fields += str("{} changed from {} to {}".format(change.field, change.old, change.new))
                return fields
            return None
        

        【讨论】:

          【解决方案4】:

          与 Rafi 之前的解决方案类似,但使用数组更优雅地列出记录更改:

          def list_changes(self, obj):
              diff = []
              if obj.prev_record:
                  delta = obj.diff_against(obj.prev_record)
          
                  for change in delta.changes:
                      diff.append("<b>* {}:</b> changed from `{}` to `{}`".format(change.field, change.old, change.new))
          
              return mark_safe("\n<br>".join(diff))
          

          【讨论】:

            猜你喜欢
            • 2020-09-29
            • 2011-05-19
            • 1970-01-01
            • 2019-08-12
            • 2016-06-20
            • 1970-01-01
            • 1970-01-01
            • 2014-12-01
            • 2017-05-08
            相关资源
            最近更新 更多