2011-04-29 31 views
5

我决定使用Django-Simple-History来构建我的模型的历史记录。反过来使用它来构建仪表板。尽管我遇到了一些困难。我试图在[时间]上输出[用户] [添加,更改,删除] [对象],但是我无法想象出我的生活。自定义仪表板的Django历史记录

到目前为止,我能够显示模板上的历史记录,但我无法访问其他任何东西,我是否错过了一些东西?

我希望有一个具有简单历史知识的人可以提供帮助,因为我无法抓住作者。

这是我迄今为止的代码片段。

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十点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 %} 

如果任何人都可以帮助或指向我更深入的文档,那就太棒了!

谢谢大家!

回答

6

Django的简单历史只是简单地创建一个反映你把它绑的对象,并将另外四场模型(以及相关的数据库表):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 }},而不是。 (不知道这些实际上是否会在实际中起作用。)当然,您可以将date筛选器应用于{{ h.history_date }},以使其成为您想要的任何格式。

获取用户比较困难。 Django-Simple-History似乎没有存储这些数据,所以没有记录用户进行修改的情况。但是,由于它基本上是复制了存在的对象,所以您可能会在为模型添加modified_by字段并用request.user预保存填充字段时逃脱。然后,当Django-Simple-History发挥作用时,该字段将像其他内容一样被复制,并通过{{ h.modified_by }}提供。

+1

谢谢,多数民众赞成在我正在寻找的线路。谢谢你的详细回应,我以前见过这个,但你的解释比我以前见过的要好。 – TheLifeOfSteve 2011-05-04 17:54:28

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/),这是非常有用的,但你必须玩的历史字段名称。我不太确定他们究竟是什么。

希望有所帮助。