Django自定义仪表盘历史记录

6 投票
2 回答
2621 浏览
提问于 2025-04-16 16:40

我决定使用Django-Simple-History来记录我的模型的历史。然后再用这些历史记录来构建仪表盘。不过,我遇到了一点麻烦。我想输出[用户] [添加、修改、删除] [对象] 在 [时间],但是我怎么也想不出来该怎么做。

到目前为止,我能在模板上显示历史记录,但我无法访问其他内容,我是不是漏掉了什么?

我希望有了解Simple History的人能帮我,因为我联系不上作者。

这是我目前的代码片段。

Models.py

from simple_history.models import HistoricalRecords

class Project(django.db.models.Model):
...
history = HistoricalRecords()

Views.py

@login_required
def addTMProject(request):
user = request.user
if request.method == 'POST':
    form = TimeMaterialsForm(request.POST)
    if form.is_valid():
        project = form.save(commit=False)
        project.created_by = request.user
        today = datetime.date.today()
        project.pre_quote = "%s-" % (str(today.year)[2:4])
        project.quote = Project.objects.latest().quote+1
        project.save()
        project.history.all()
        ...

我也在我的dashboard/views.py中传递了它,所以我可以访问它。

@login_required
def view_dash(request):
    today = datetime.date.today()
    user = request.user 
    proj_perm = user.has_perm('project.add_project')
    project = Project.objects.all().order_by('-proj_name')
    query = Project.objects.all().order_by('-id')[:5]
    que_quotes = Project.objects.filter(status__value__exact = 'Quote')
    expired = FollowUp.objects.filter(next_followup__lte=today).order_by('next_followup').filter(archived=False)
    log = LogEntry.objects.select_related().all().order_by("-id")
    hist = Project.history.all()
return render_to_response('dashboard/home.html', {'user': user, 'project': project, 'query':query, 'que_quotes':que_quotes, 'expired':expired,
                                                  'proj_perm':proj_perm, 'log': log, 'hist':hist,}, context_instance=RequestContext(request))

最后,这是我模板中的一个片段。现在的情况是,{{ h }}在模板上显示“Testing Simple Records as of 2011-04-29 10:43:57”。

home.html

{% if user.is_authenticated %}
<div id="large_box">
    <h5>Activity</h5>
        {% for h in hist %}
        <ul>
            <li>{{ h }}</li>
        </ul>
        {% endfor %}

如果有人能帮我或者指引我找到更详细的文档,那就太好了!

谢谢大家!

2 个回答

1

我猜你遇到的问题只是历史数据的显示,而不是保存数据的部分。

我不太清楚你在项目模型中有哪些字段,但看起来历史字段像是一个外键字段。这个外键对应的表里有和你的项目模型一样的字段。所以,如果你想在模板中访问这些字段,你需要这样做:

...
{% for h in hist %}
<ul>
    <li>{{h.field1}} {{h.field2}} {{h.field3}} on {{h.field4}}</li>
</ul>
{% endfor %}
...

我找到了一篇很有用的文章(http://qr7.com/2010/10/django-simple-history-ftw/),不过你可能需要自己试试历史字段的名称。我不太确定它们具体是什么。

希望这能帮到你。

9

Django-Simple-History 是一个工具,它会创建一个模型(还有对应的数据库表),这个模型和你要关联的对象一模一样,并且会多加四个字段:history_idhistory_datehistory_typehistory_object

history_id:这是一个标准的主键,用来唯一标识每一条记录。

history_date:记录修改发生的时间。

history_type:这个字段的值可以是 +~-。其中 + 表示添加了新内容,~ 表示修改了内容,- 表示删除了内容。

history_object:这是正在记录历史的模型的表示。

简单来说,你可以通过这个工具得到类似于“在[时间]时,[对象]被[添加、修改、删除]”这样的输出,使用的代码大概是这样的:

{{ h.history_type }} {{ h.history_object }} on/at {{ h.history_date }}

你可能想要创建一个模板标签,把 +~- 转换成更容易理解的“创建”、“修改”、“删除”。我猜 {{ h.history_object }} 会返回对象的 __unicode__,所以你可能需要做一些调整,或者返回像 {{ h.history_object.__class__ }}{{ h.history_object._meta.verbose_name }} 这样的内容。(不过我不确定这些在实际中是否能用。)当然,你也可以对 {{ h.history_date }} 应用 date 过滤器,来把日期格式化成你想要的样子。

获取用户信息就比较复杂了。Django-Simple-History 似乎并不存储这个数据,所以没有记录是谁进行了修改。不过,由于它基本上是复制了对象的状态,你可以考虑在你的模型中添加一个 modified_by 字段,并在保存之前把这个字段填上 request.user。这样,当 Django-Simple-History 处理的时候,这个字段也会像其他字段一样被复制过来,并可以通过 {{ h.modified_by }} 获取。

撰写回答