2011-01-16 6 views
1

Hey, Ich versuche, das Signal pre_save auf meinem Modell zu arbeiten, aber dort scheint ein Problem mit einem Fremdschlüssel oder etwas zu sein. Mein Modell ist wie folgt aus:Django: Signal Callback-Funktion fehlt fremd auf Modell

class BlogEntry(models.Model): 
    headline = models.CharField(max_length=100) 
    content = models.CharField(max_length=2000) 
    written_by = models.ForeignKey(User) 
    date = models.DateTimeField(auto_now=True) 
    project = models.ForeignKey(Project) 

Und hier ist, wo die Form verarbeitet und gespeichert:

def form_valid(self, blogform): # post a blogentry 
     blog_entry = blogform.save(commit=False) 
     blog_entry.written_by = self.request.user 
     blog_entry.project = blog_entry.project #debugging shows that this 
    is a valid instance of the Project model 
     blog_entry.save() 

    return TemplateResponseMixin.render_to_response(self, 
self.get_context_data()) 

Und hier ist mein Signal reciever Funktion

@receiver(post_save, sender=BlogEntry) 
def project_blog_entry_signal(sender, **kwargs): 
    log = Log() 
    log.project = sender.project.field 
    log.content_type = Log.content_new_blogentry 
    log.save() 

Und hier ist die Ausnahme:

Kann nicht zugewiesen werden "django.db.models.fields.related.ForeignKey Objekt bei 0x21eef86c": "Log.project" muss eine "Project" -Instanz sein.

@the Linie ---> log.project = sender.project.field in

project_blog_entry_signal() Funktion

Der Absender Objekt scheint nicht zu Übergeben Sie das Projekt als Modellinstanz, sondern als Fremdschlüsselinstanz. Warum das?

Antwort

2

Gelöst es. Das Argument 'sender' ist nur ein Klassenobjekt, keine Instanz. In meinem Rückruf kann ich die Instanz durch die kwargs wie Referenz: blog_entry_instance = kwargs [ „Instanz“]

So ist die Callback-Funktion würde wie folgt aussehen:

@receiver(post_save, sender=BlogEntry) 
def project_blog_entry_signal(sender, **kwargs): 
    log = Log() 
    log.project = kwargs["instance"].project 
    log.content_type = Log.content_new_blogentry 
    log.save() 
+1

Nur dir etwas Tipp zu sparen, könnten Sie Definieren Sie Ihre Funktionsparameter als "def project_blog_entry_signal (sender, instance, ** kwargs)". Auf diese Weise müssen Sie nicht "kwargs [" instance "]", sondern "instance" eingeben :) – LaundroMat