django历史对象价值
我知道那里有回归,我知道在django有fullhistory分支。但我非常希望坚持django对象的原始历史。我只需要确保保存新旧值 默认情况下,django只保存发生的内容(例如更新),但不存储值。任何人都可以向我指出一些东西(代码片段或应用程序),它们略微增强了django的默认历史记录,并且还存储了已编辑属性的值,而不仅仅是它被编辑的事实 现在我的历史告诉我 9-01-2012 12:55:02日期:时间 我想让它说 9-01-2012 12:55:02时间:6点到8点 更新:==>对于任何对我的解决方案感兴趣的人(基于下面的答案)django历史对象价值,django,Django,我知道那里有回归,我知道在django有fullhistory分支。但我非常希望坚持django对象的原始历史。我只需要确保保存新旧值 默认情况下,django只保存发生的内容(例如更新),但不存储值。任何人都可以向我指出一些东西(代码片段或应用程序),它们略微增强了django的默认历史记录,并且还存储了已编辑属性的值,而不仅仅是它被编辑的事实 现在我的历史告诉我 9-01-2012 12:55:02日期:时间 我想让它说 9-01-2012 12:55:02时间:6点到8点 更新:==>对于
class HistoryModel(object):
changed_fields = {}
@receiver(pre_save, sender=Customer)
def save_old_values(sender,**kwargs):
#dont delete using in eval
db_obj = sender.objects.get(pk=kwargs['instance'].pk)
for field in kwargs['instance']._meta.fields:
if not eval("db_obj." + str(field.get_attname_column()[0])) == eval("kwargs['instance']." + str(field.get_attname_column()[0])):
kwargs['instance'].changed_fields[field.get_attname_column()[0]] = "from "+str(eval("db_obj." + str(field.get_attname_column()[0]))) + " to " + str(eval("kwargs['instance']." + str(field.get_attname_column()[0])))
它不是“默认的django”。您使用的是一个贡献的django应用程序(),因此它是一个类似于其他任何应用程序(即django恢复)的应用程序,并且在某种程度上,它不支持您想要的现成功能
幸运的是,django管理员是完全可配置的。您可以尝试使用
ModelAdmin
类的方法,通过检测哪些字段发生了更改(通过将表单值与数据库值进行比较),使change\u消息更加详细。您可能希望在项目中的所有应用程序中都使用此功能,因此可以编写一个mixin来支持此功能,也可以将整个管理和硬编码功能分开 仅覆盖ModelAdmin.construct\u change\u message
方法就足以扩展有关更改的信息。不需要在模型上添加属性(例如,changed_字段),因为您可以从表单和表单集的初始数据构建日志消息
此版本记录每个更改字段的上一个值:
def construct_change_message(self, request, form, formsets):
change_message = []
if form.changed_data:
msg_list = u''
for field in form.changed_data:
if form.initial[field] is not None and hasattr(form.fields[field], 'queryset'):
old_value = form.fields[field].queryset.get(id=form.initial[field]).__unicode__()
else:
old_value = form.initial[field]
msg_list = _("{0}field '{1}' from \"{2}\", ").format(msg_list, field, old_value)
change_message.append(capfirst(_(u'changed {0}.').format(msg_list[:-2])))
if formsets:
for formset in formsets:
for added_object in formset.new_objects:
change_message.append(_('Added %(name)s "%(object)s".')
% {'name': force_unicode(added_object._meta.verbose_name),
'object': force_unicode(added_object)})
for changed_object, changed_fields in formset.changed_objects :
for form in formset.initial_forms:
if form.instance != changed_object:
continue
msg_list = u''
for field in changed_fields:
if form.initial[field] is not None and hasattr(form.fields[field], 'queryset'):
old_value = form.fields[field].queryset.get(id=form.initial[field]).__unicode__()
else:
old_value = form.initial[field]
msg_list = _("{0}field '{1}' from \"{2}\", ").format(msg_list, field, old_value)
change_message.append(_('Changed %(list)s for %(name)s "%(object)s".')
% {'list': msg_list[:-2],
'name': force_unicode(changed_object._meta.verbose_name),
'object': force_unicode(changed_object)})
for deleted_object in formset.deleted_objects:
change_message.append(_('Deleted %(name)s "%(object)s".')
% {'name': force_unicode(deleted_object._meta.verbose_name),
'object': force_unicode(deleted_object)})
change_message = ' '.join(change_message)
return change_message or _('No fields changed.')
太好了,谢谢,这帮了大忙!最后,我在我的自定义管理类中使用了覆盖log_更改的方法,并在模型中附加了一个pre_save函数,以保留旧值(在调用log_更改时这些值已经消失)。谢谢