simple - django-reversion y modelo relacionado
django simple history (2)
Tengo los siguientes modelos.py
class Contact(models.Model):
pass
class Link(models.Model):
pass
class Relationship(models.Model):
# Documentation
__doc__ = _(u''Stores a relationship between 2 contacts.'')
# Attributes
from_contact = models.ForeignKey(Contact, related_name=''from_contacts'', verbose_name=_(u''first contact''), help_text=_(u''The first contact implicated by the relationship.''))
link = models.ForeignKey(Link, related_name=u''relationships'', verbose_name=_(u''relationship link''), help_text=_(u''The relationship link between both contacts.''))
to_contact = models.ForeignKey(Contact, related_name=''to_contacts'', verbose_name=_(u''second contact''), help_text=_(u''The second contact implicated by the relationship.''))
# Meta-data
class Meta:
verbose_name = u''Relationship''
verbose_name_plural = u''Relationships''
unique_together = (''from_contact'', ''link'', ''to_contact'')
Usando la vista basada en clase de Django y el Revision Context Manager
, puedo crear una revisión en cualquier momento que cree una nueva relación entre 2 contactos
# part of my views.py
class RelationshipCreateView(LoginRequiredMixin, CreateView):
template_name = u''frontend/relationships/relationship-create.html''
model = Relationship
form_class = RelationshipForm
def get_success_url(self):
return reverse_lazy(''contact-detail'', kwargs={''contact_pk'': self.kwargs[''contact_pk'']})
def form_valid(self, form):
contact = Contact.objects.get(pk=self.kwargs[''contact_pk''])
link = form.cleaned_data[''link'']
other = form.cleaned_data[''other'']
inverse = form.cleaned_data[''inverse_relationship'']
relationship = None
if not inverse:
relationship = Relationship(
from_contact=contact,
link=link,
to_contact=other
)
else:
relationship = Relationship(
from_contact=other,
link=link,
to_contact=contact
)
with reversion.create_revision():
relationship.save()
reversion.set_comment(_(u''A relationship has been added between %(from)s and %(to)s'' % {''from'': relationship.from_contact, ''to'': relationship.to_contact}))
return HttpResponseRedirect(self.get_success_url())
Pero solo uno de los contactos obtiene la revisión (el primero) y el comentario que viene con ella. ¿Cómo se puede usar el Revision Context Manager
para crear ambas revisiones?
Probablemente un poco tarde, pero creo que con una versión reciente de reversión puedes seguir las relaciones:
Añade esta línea al final de tu modelo:
reversion.register(Relationship, follow=[''from_contact'', ''link'', ''to_contact''])
Django Model Utils es la nueva y mejor manera de realizar un seguimiento de los cambios en modelos y campos de modelos, así como hacer muchas otras cosas realmente interesantes.