Как узнать, какие значения отличаются от существующих в базе данных при запросе 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