1

所以我将 django-simple-history 用于我的一个项目。我在一个名为“地址”的模型上使用它来显示记录的历史。

我创建了一个 DetailView 来显示有关地址的信息,并添加了 context['history'] 来显示记录的更改。这一切正常。

我会对哪些领域发生了变化感兴趣,我阅读了以下内容;历史差异

所以我不知何故需要遍历最后两条记录中的所有字段并找到已更改的字段...

我找不到任何关于如何实现这一点的示例,所以我尝试将上下文添加到视图中

#views.py

class Address(DetailView):
'''
Show details about the address
'''
    model = Address

    '''
    Add history context to the view and show latest changed field
    '''
    def get_context_data(self, **kwargs):
        context = super(Address, self).get_context_data(**kwargs)
        qry = Address.history.filter(id=self.kwargs['pk'])
        new_record = qry.first()
        old_record = qry.first().prev_record
        context['history'] = qry
        context['history_delta'] = new_record.diff_against(old_record)

        return context

和一个简单的模型

#models.py

class Address(models.Model)
    name = models.CharField(max_length=200)
    street = models.CharField(max_length=200)
    street_number = models.CharField(max_length=4)
    city = models.CharField(max_length=200)

模板

#address_detail.html

<table>
    <thead>
        <tr>
            <th scope="col">Timestamp</th>
            <th scope="col">Note</th>
            <th scope="col">Edited by</th>
        </tr>
    </thead>
    <tbody>
    {% for history in history %}
        <tr>
            <td>{{ history.history_date }}</td>
            <td>{{ history.history_type }}</td>
            <td>{{ history.history_user.first_name }}</td>
        </tr>
    {% endfor %}
    </tbody>
</table>

不知何故,这感觉不对,应该有一种方法来迭代更改并仅将更改的字段添加到上下文中...

任何想法,将不胜感激!

4

1 回答 1

0

我最近在这方面工作。我认为您错过了将更改存储在 history_delta 中的技巧。您可以使用它来显示更改的字段。以下将显示列表结果,例如更改了哪个字段以及该字段的旧值和新值。

{% if history_delta %}
    <h3>Following changes occurred:</h3>
<table>
    <tr>
        <th>Field</th>
        <th>New</th>
        <th>Old</th>
    </tr>
    {% for change in delta.changes %}
        <tr>
            <td>
                <b>{{ change.field }}</b>
            </td>
            <td>
                <b>{{ change.new }}</b>
            </td>
            <td>
                <b>{{ change.old }}</b>
            </td>
        </tr>
    {% endfor %}
</table>
{% else %}
    <p>No recent changes found.</p>
{% endif %}
于 2019-12-10T14:15:08.167 回答