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