Возврат объектов на сайте вместо администратора с использованием простой истории 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 работает как обычно.

Вы можете вернуться, показав исторический экземпляр и сохранить (таким образом вы будете публиковать свои исторические данные).

Другие вопросы по тегам