2016-04-07 2 views
1

Ich habe ein Signal mit einem m2mchanged-Empfänger implementiert, um ein PositivIntegerField in meinem Image-Modell zu aktualisieren. Dieses PositiveIntegerField ist für total_likes des Bildes, aber bei der Implementierung des Signals erkannte ich, dass sich das Feld total_likes nicht von Null änderte. Ich begann zu experimentieren und fand heraus, dass sich dieser Wert nicht ändert, selbst wenn ich ihn in der Shell oder der Admin-Seite selbst ändere.Bearbeiten von Modellfeldern/Django Signal zum Aktualisieren von Bildlikes funktioniert nicht/

Ich glaube nicht, dass dies ein Problem mit dem Signal/Empfänger ist, sondern etwas anderes geschieht, das den Wert in der Datenbank nicht verändern lässt.

Hier ist mein Code.

models.py

class Image(models.Model): 
user = models.ForeignKey(settings.AUTH_USER_MODEL, 
         related_name='images_created') 
title = models.CharField(max_length=200) 
slug = models.SlugField(max_length=200, 
         blank=True) 
url = models.URLField() 
image = models.ImageField(upload_to='images/%Y/%m/%d') 
description = models.TextField(blank=True) 
created = models.DateField(auto_now_add=True, db_index=True) 




def __str__(self): 
    return self.title 

def save(self, *args, **kwargs): 
    if not self.slug: 
     self.slug = slugify(self.title) 
     super(Image, self).save(*args, *kwargs) 

users_like = models.ManyToManyField(settings.AUTH_USER_MODEL, 
            related_name='images_liked', 
            blank=True) 
def get_absolute_url(self): 
    return reverse('images:detail', args=[self.id, self.slug]) 

tags = TaggableManager() 
total_likes = models.PositiveIntegerField(db_index=True, default=0) 

Ich kann die signals.py Dateien oder einen anderen Code bei Bedarf erstellen. Vielen Dank!

Lösung

war mein Problem mein speichern Methode überschrieben, ich habe es in die folgenden geändert.

def save(self, *args, **kwargs): 
    if not self.slug: 
     self.slug = slugify(self.title) 
     super(Image, self).save(*args, *kwargs) 
    elif self.slug != slugify(self.title): 
     self.slug = slugify(self.title) 
     super(Image, self).save(*args, *kwargs) 
    else: 
     super(Image, self).save(*args, *kwargs) 
+1

ich mein Problem –

Antwort

1

korrekte und einfache Lösung wird es hier sein:

def save(self, *args, **kwargs): 
    if not self.id: # don't allow to change slug after object created 
     self.slug = slugify(self.title) 
    super(Image, self).save(*args, **kwargs) 
+0

noch besser gelöst. Danke Schlägst du vor, dass der Slug nach dem Erstellen des Objekts nicht geändert werden darf? –

+0

Weil es eine eindeutige Identifikation hat, wie die 'ID', also sollten Sie es nicht ändern. Für den Fall, dass Sie es ändern können - ersetzen Sie einfach 'wenn nicht selbst.id' durch 'wenn nicht self.slug'. – crash843

Verwandte Themen