История Django для пользовательской панели мониторинга

#python #django #django-models #django-templates #django-views

#python #django #django-модели #django-шаблоны #django-просмотры

Вопрос:

Я решил использовать Django-Simple-History для построения истории моих моделей. В свою очередь, используя это для создания панели мониторинга. Однако я столкнулся с небольшой проблемой. Я пытаюсь вывести [User] [добавленный, измененный, удаленный] [object] в / в [time], но я не могу понять это ни за что на свете.

Пока я могу отображать историческую запись в шаблоне, но я не могу получить доступ ни к чему другому, я что-то упускаю?

Я надеялся, что кто-нибудь, знающий простую историю, сможет помочь, поскольку я не смог дозвониться до автора.

Вот фрагменты кода, которые у меня есть на данный момент.

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 }} показывает «Тестирование простых записей по состоянию на 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 %}
  

Если бы кто-нибудь мог помочь или указать мне на более подробную документацию, то это было бы здорово!

Спасибо всем!

Ответ №1:

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 }} вместо этого. (Хотя не уверен, что это действительно сработает на практике.) И, конечно, вы можете применить date фильтр к {{ h.history_date }} , чтобы придать ему любой формат, который вы хотите.

Получить пользователя сложнее. Django-Simple-History, похоже, не хранит эти данные, поэтому нет записи о том, какой пользователь внес изменения. Однако, поскольку он в основном дублирует объект в том виде, в каком он существовал, вам, вероятно, могло бы сойти с рук добавление modified_by поля в вашу модель и заполнение его с помощью request.user предварительного сохранения. Затем, когда Django-Simple-History сделает свое дело, это поле будет скопировано, как и остальные, и будет доступно через {{ h.modified_by }} .

Комментарии:

1. Спасибо, это больше соответствует тому, что я ищу. Также спасибо за подробный ответ, я видел это раньше, но ваше объяснение лучше, чем то, что я видел ранее.

Ответ №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 /) что было весьма полезно, но вам придется поиграть с именами полей истории. Я не был совсем уверен, что это такое на самом деле.

Надеюсь, это поможет.