使用django简单历史记录恢复网站上的对象而不是管理员

时间:2017-11-24 00:57:51

标签: django python-3.x django-templates django-views django-simple-history

我在管理网站上使用了django简单历史记录包,以便能够跟踪并恢复到模型对象的先前版本。我正在设计一个Web表单,允许用户使用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 个答案:

答案 0 :(得分:1)

我通过将HistoricForm添加到我的模型表单中做了类似的事情。

class MyModelForm(HistoricForm, ModelForm):
     ...

HistoricForm需要额外的history_id kwarg。 如果提供了history_id,则HistoricForm将使用historical_instance交换ModelForm实例(在history_id时您的实例看起来像什么)。这样,您的表单将显示对象的历史版本。

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将照常工作。

您可以通过显示历史实例并保存来恢复(这样您就会发布您的历史数据)。