Как узнать, какие значения отличаются от существующих в базе данных при запросе request.POST

У меня такой вид (усеченный) для редактирования существующих Projects:

def edit_project(request):
    if request.method == 'POST':
        project_to_edit = Project.objects.get(pk=request.POST['project_id'])
        form = CreateNewProjectForm(request.POST, instance=project_to_edit)
        if form.is_valid():
            form.save()
            return redirect('project_page')
        else:
            return redirect('edit_project')
    return redirect('index')

Работает отлично, все как ожидалось, но я хотел бы как-то узнать, какие поля обновляются/изменяются наиболее питоническим способом.

Причина, по которой я хочу знать, какие поля изменены, заключается в том, чтобы сохранить запись в моей модели AuditHistory для каждого измененного поля.

Идеально я хотел бы добавить следующий код после строки form.save():

username = None
if request.user.is_authenticated:
    user = request.user
if user:
    #for each modified field, save a row into AuditHistory
    audit_history_entry = AuditHistory(user=user, event="Edit Project", changed_field="?", old_value="?", new_value="?")
    audit_history_entry.save()

FieldTracker - это то, что вам нужно.

Все, что вам нужно использовать, это добавить это в вашу модель:

tracker = FieldTracker()

Вы можете отследить, изменилось ли поле:

>>> a = Post.objects.create(title='First Post')
>>> a.title = 'Welcome'
>>> a.tracker.has_changed('title')
True
>>> a.tracker.has_changed('body')
False

Получите все измененные поля:

>>> a = Post.objects.create(title='First Post')
>>> a.title = 'Welcome'
>>> a.body = 'First post!'
>>> a.tracker.changed()
{'title': 'First Post', 'body': ''}

И посмотрите, каким было предыдущее значение:

>>> a = Post.objects.create(title='First Post')
>>> a.title = 'Welcome'
>>> a.tracker.previous('title')
u'First Post'

FieldTracker требует django-model-utils, который может быть установлен с помощью pip:

pip install django-model-utils
Вернуться на верх