【问题标题】:Django History for Custom Dashboard自定义仪表板的 Django 历史记录
【发布时间】:2011-08-15 14:08:43
【问题描述】:

我决定使用Django-Simple-History 来构建我的模型的历史。反过来使用它来构建仪表板。不过,我遇到了一些障碍。我正在尝试在 [时间] 上/在 [时间] 输出 [用户] [添加、更改、删​​除] [对象],但我一生都无法弄清楚。

到目前为止,我可以在模板上显示历史记录,但我无法访问其他任何内容,是我遗漏了什么吗?

我希望了解简单历史的人可以提供帮助,因为我无法联系到作者。

这是我目前拥有的代码 sn-ps。

模型.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))

最后是我的模板中的一个 sn-p。现在,{{ 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 %}

如果有人可以帮助或向我指出一些更深入的文档,那就太好了!

谢谢大家!

【问题讨论】:

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


    【解决方案1】:

    Django-Simple-History 只是创建一个模型(和关联的数据库表),该模型反映了您将其绑定到的对象并添加了四个附加字段:history_idhistory_datehistory_typehistory_object

    history_id:标准主键

    history_date:更改发生的日期时间

    history_type+~- 之一。 (+ 表示添加,~ 表示更改,- 表示删除)

    history_object: 存储历史的模型的表示

    因此,在最基本的层面上,您可以在输出中粗略地获得“[add,changed,deleted] [object] on/at [time]”,使用的效果如下:

    {{ 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 }} 提供。

    【讨论】:

    • 谢谢,这更符合我的要求。也感谢您的详细回复,我以前看过这个,但您的解释比我以前看到的要好。
    【解决方案2】:

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

    我不确定您的项目模型中有哪些字段,但看起来历史字段被视为外键字段。此外键的表包含与您的 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/) 很有帮助,但是您必须使用历史字段名称。我不太确定它们到底是什么。

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2021-05-07
      • 1970-01-01
      • 1970-01-01
      • 2016-06-05
      • 2012-09-06
      • 2018-07-20
      • 2019-08-15
      • 2020-10-10
      • 2020-10-23
      相关资源
      最近更新 更多