2

私はそこに復帰があることを知っています.djangoには完全な履歴ブランチがあることを知っています. しかし、django オブジェクトの元の歴史に固執したいと思います。OLD 値と NEW 値も確実に保存する必要があるだけです。

デフォルトでは、django は何が起こったか (更新など) を保存するだけで、値は保存しません。誰でも、djangoのデフォルトの履歴をわずかに強化し、編集されたという事実だけでなく、編集された属性の値も保存する何か(スニペットまたはアプリ)を指摘できます。

今、私の歴史は言う

2012 年 9 月 1 日 12:55:02 変更: 時間

言ってもらいたい

9-01-2012 12:55:02 変更: 6 から 8 までの時間

更新: ==>私のソリューションに興味がある人向け(以下の回答に基づく)..

  1. models.py に HistoryModel(object) クラスを追加しました

       class HistoryModel(object):
             changed_fields = {}
    
  2. 私のモデルのいずれかで継承

  3. 古い値を保存する pre_save レシーバーを追加しました。

        @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])))
    
  4. 管理者の log_change メソッドを上書きし、object.changed_fields dict を収集してメッセージとして保存しました

4

2 に答える 2

2

「デフォルトのジャンゴ」ではありません。寄贈された django アプリケーション ( admin ) を使用しているため、他のアプリケーション (つまり、django-reversion) と同じであり、その範囲で、すぐに使用できる機能をサポートしていません。

幸いなことに、django admin はかなり設定可能です。クラスのメソッドを上書きして、log_changeどのフィールドが変更されたかを検出することにより (フォームの値をデータベースの値と比較することにより)、より詳細にすることができます。おそらく、プロジェクト内のすべてのアプリでこの機能が必要なため、これをサポートする mixin を作成するか、管理者全体をフォークして機能をハードコードすることができます。ModelAdminchange_message

于 2013-02-01T09:07:01.910 に答える
1

変更に関する情報を拡張するには、ModelAdmin.construct_change_messageメソッドのみをオーバーライドするだけで十分です。フォームとフォームセットの初期データからログ メッセージを作成できるため、モデルに属性 (changed_fields など) を追加する必要はありません。

これは、変更されたすべてのフィールドの以前の値を記録するバージョンです。

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.')
于 2013-07-31T11:44:35.887 に答える