Возврат объектов на сайте вместо администратора с использованием простой истории django
Я использовал пакет простой истории django на сайте администратора, чтобы иметь возможность отслеживать и возвращаться к предыдущим версиям объекта модели. Я разрабатываю веб-форму, которая позволяет пользователям изменять экземпляры объекта модели с помощью формы модели на django и хотела бы позволить пользователям просматривать и возвращаться к предыдущим версиям. Также, чтобы позволить им увидеть, какие изменения по сравнению с текущей версией.
С помощью приведенного ниже кода я могу получить список исторических записей в моем шаблоне под своей историей.
class CompanyDetailView(LoginRequiredMixin,generic.DetailView):
model = Company
def get_context_data(self, **kwargs):
context = super(CompanyDetailView, self).get_context_data(**kwargs)
company_instance = self.object
context['histoire'] = company_instance.history.all()
return context
В моем шаблоне
<p>
Previous versions:
{% for item in histoire %}
<li>
{{ item }} submitted by {{ item.history_user }} {{
item.history_object }}
</li>
{% endfor %}
</p>
Но в идеале я хочу, чтобы item.history_object был ссылкой, которую пользователи могут просматривать предыдущий объект и иметь возможность вернуться при желании.
1 ответ
Я сделал нечто подобное, добавив HistoricForm в мои модельные формы.
class MyModelForm(HistoricForm, ModelForm):
...
HistoricForm принимает и дополнительный history_id kwarg. Если указан history_id, HistoricForm заменяет экземпляр ModelForm на исторический_инстанс (как выглядел ваш экземпляр во время исторического_идентификатора). Таким образом, ваша форма покажет историческую версию вашего объекта.
class HistoricForm(object):
def __init__(self, *args, **kwargs):
self.history_id = kwargs.pop('history_id', None)
instance = kwargs.get('instance')
if instance and self.history_id:
kwargs['instance'] = self.get_historic_instance(instance)
super(HistoricForm, self).__init__(*args, **kwargs)
def get_historic_instance(self, instance):
model = self._meta.model
queryset = getattr(model, 'history').model.objects
historic_instance = queryset.get(**{
model._meta.pk.attname: instance.pk,
'history_id': self.history_id,
}).instance
return historic_instance
Если history_id не указан, то ModelForm работает как обычно.
Вы можете вернуться, показав исторический экземпляр и сохранить (таким образом вы будете публиковать свои исторические данные).