2011-04-29 13 views
5

He decidido usar Django-Simple-History para compilar el historial de mis modelos. A su vez, usar eso para construir el tablero. Me he topado con un pequeño inconveniente. Estoy tratando de enviar [Usuario] [agregado, cambiado, eliminado] [objeto] en/a [tiempo] pero no puedo entenderlo por mi vida.Django History for Custom Dashboard

Hasta ahora puedo mostrar el registro histórico en la plantilla pero no puedo acceder a nada más, ¿me falta algo?

Esperaba que alguien con conocimiento de Historia Simple pueda ayudar, ya que no pude contactar al autor.

Aquí están los fragmentos de código que tengo hasta ahora.

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() 
     ... 

y también he pasado en mi tablero/views.py así que tienen acceso a ella.

@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)) 

Y finalmente un fragmento de mi plantilla. Ya que es en este momento, el {{h}} muestra la "Prueba de registros simple como de 2011-04-29 10:43:57" en la plantilla

home.html

{% if user.is_authenticated %} 
<div id="large_box"> 
    <h5>Activity</h5> 
     {% for h in hist %} 
     <ul> 
      <li>{{ h }}</li> 
     </ul> 
     {% endfor %} 

si alguien puede ayuda o apúntame a una documentación más profunda, ¡entonces sería genial!

¡Gracias a todos!

Respuesta

6

Django-simple-Historia simplemente crea un modelo (y la tabla de base de datos asociada) que refleja el objeto que se ata a y añade cuatro campos adicionales: history_id, history_date, history_type, y history_object.

history_id: estándar primario clave

history_date: fecha y hora para cuando el cambio se produjo

history_type: uno de +, ~, -.(+ medios añaden, ~ medios cambian, y - significa borrados)

history_object: representación del modelo que la historia se almacena para

Así, en el nivel más básico, puede más o menos GET "[añadido, cambiado , eliminado] [objeto] en/a las [hora]" en su salida, usando algo en el sentido de:

{{ h.history_type }} {{ h.history_object }} on/at {{ h.history_date }} 

Es probable que desee crear etiqueta de plantilla o algo para convertir el +, ~, y - a la más comprensible, 'Creado', 'Modificado', 'Eliminado'. {{ h.history_object }} debe devolver el objeto __unicode__, supongo, por lo que es posible que tenga que hacer algunas modificaciones allí o devolver algo como {{ h.history_object.__class__ }} o {{ h.history_object._meta.verbose_name }}, en su lugar. (Sin embargo, no estoy seguro de si realmente funcionarán en la práctica). Y, por supuesto, puede aplicar el filtro date al {{ h.history_date }} para convertirlo en el formato que desee.

Conseguir que el usuario sea más difícil. Django-Simple-History no parece almacenar estos datos, por lo que no hay registro de qué usuario hizo la modificación. Sin embargo, dado que básicamente duplica el objeto tal como existía, probablemente podría salirse con la suya agregando un campo modified_by a su modelo y llenando eso con request.user previo a guardar. Luego, cuando Django-Simple-History haga lo suyo, ese campo se copiará como el resto y estará disponible a través del {{ h.modified_by }}.

+1

Gracias, eso es más en la línea de lo que estoy buscando. Gracias por la respuesta detallada también, he visto esto antes, pero tu explicación es mejor que la que he visto anteriormente. – TheLifeOfSteve

1

Supongo que el único problema que tiene es con la visualización de los datos históricos y no la porción de ahorro real de la misma.

No estoy seguro de qué campos tiene en su modelo de proyecto, pero parece que el campo de historial se trata como un campo de clave externa. La tabla de esta clave externa contiene los mismos campos que su modelo de Proyecto. Por lo tanto, si desea acceder a los campos que tendría que hacer algo como esto en su plantilla:

... 
{% for h in hist %} 
<ul> 
    <li>{{h.field1}} {{h.field2}} {{h.field3}} on {{h.field4}}</li> 
</ul> 
{% endfor %} 
... 

encontré esta página (http://qr7.com/2010/10/django-simple-history-ftw/) que era bastante útil, pero tendrá que jugar con los nombres de los campos de historia No estaba muy seguro de lo que realmente eran.

Espero que ayude.