2013-10-11 7 views
18

ich habe folgende models.pydjango-Reversion und verwandte Modell

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

Mit klassenbasierte Ansicht von Django und die Revision Context Manager, ich Revision jederzeit erstellen können, erstelle ich eine neue Beziehung zwischen zwei Kontakten

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

Aber nur einer der Kontakte bekommt die Revision (die erste) und der Kommentar kommt damit. Wie kann Revision Context Manager verwendet werden, um beide Revisionen zu erstellen?

+0

Versuchen Sie, in einer Schleife eine Liste ['from', 'to'] mit umgekehrter Beziehung beim zweiten Mal. – jcs

+0

Sie sprechen davon, beide Kontakte zu speichern? – TonyEight

+1

Ich weiß, dass dieses Problem alt ist, aber hast du das jemals gelöst? Sind Sie [registrieren die ausländischen Schlüssel zu folgen] (http://django-reversion.readthedocs.org/en/latest/api.html#advanced-model-registration)? – tutuDajuju

Antwort

5

Wahrscheinlich ein bisschen spät, aber ich denke, mit einer aktuellen Version des Rückschlags Sie die Beziehungen folgen:

Fügen Sie diese Zeile am Ende des Modells:

reversion.register(Relationship, follow=['from_contact', 'link', 'to_contact'])

-1

Django Model Utils ist der neue Best-Practice-Weg, um Änderungen an Modellen und Modellfeldern zu verfolgen und viele andere wirklich coole Sachen zu machen.

+0

Wenn Sie [FieldTracker] (https://django-model-utils.readthedocs.org/en/latest/utilities.html#field-tracker) angegeben haben, dann: bravo! Genau was wir damals brauchten! Danke, trotzdem :) – TonyEight

+0

Es war tatsächlich das! Handy :) – TimmyGee

+0

Das ist keine Antwort auf diese Frage zu Reversion. – acidjunk