Django自定义仪表盘历史记录
我决定使用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 个回答
我猜你遇到的问题只是历史数据的显示,而不是保存数据的部分。
我不太清楚你在项目模型中有哪些字段,但看起来历史字段像是一个外键字段。这个外键对应的表里有和你的项目模型一样的字段。所以,如果你想在模板中访问这些字段,你需要这样做:
...
{% 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/),不过你可能需要自己试试历史字段的名称。我不太确定它们具体是什么。
希望这能帮到你。
Django-Simple-History 是一个工具,它会创建一个模型(还有对应的数据库表),这个模型和你要关联的对象一模一样,并且会多加四个字段:history_id
、history_date
、history_type
和 history_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 }}
获取。