Django自定义仪表板历史

时间:2011-04-29 15:17:09

标签: python django django-models django-templates django-views

我已决定使用Django-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()
        ...

我还在我的仪表板/ 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}}在模板上显示“从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 个答案:

答案 0 :(得分:7)

Django-Simple-History只是创建一个模型(和相关的数据库表),它反映了你绑定它的对象,并添加了四个额外的字段:history_idhistory_datehistory_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 }}之类的内容。 (不确定这些内容是否会在实际中有效。)当然,您可以将date过滤器应用于{{ h.history_date }},以使其成为您想要的任何格式。

让用户更加困难。 Django-Simple-History似乎不存储这些数据,因此没有用户进行修改的记录。但是,由于它基本上复制了存在的对象,因此您可能会在模型中添加modified_by字段并使用request.user预存储来填充该字段。然后,当Django-Simple-History发挥作用时,该字段将像其他字段一样被复制,并可通过{{ h.modified_by }}获得。

答案 1 :(得分:1)

我假设您遇到的唯一问题是显示历史数据而不是实际的保存部分。

我不确定您在Project模型中有哪些字段,但看起来历史字段被视为外键字段。此外键的表包含与Project模型相同的字段。因此,如果您想访问这些字段,您必须在模板中执行以下操作:

...
{% 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/)非常有帮助,但您必须使用历史记录字段名称。我不太确定他们到底是什么。

希望有所帮助。