2017-01-04 2 views
0

Ich habe dieses Modell Post von den Benutzern sparen:Aufschalten speichern Methodenliste in der viele zu viele Feld hinzufügen

class Tag(models.Model): 
    name = models.CharField(max_length=255, unique=True) 

def add_tags(obj_id, body): 
    object = Post.objects.get(id=obj_id) 
    tag_list = [Tag.objects.create(name=word) for word in body.split()] 
    for tag in tag_list: 
     object.tags.add(tag) 

class Post(models.Model): 
    user = models.ForeignKey(User) 
    body = models.TextField() 
    tags = models.ManyToManyField(Tag, blank=True) 
    pub_date = models.DateTimeField(default=timezone.now) 
    activity = GenericRelation(Activity, related_query_name="posts") 

    def save(self, *args, **kwargs): 
     super(Post, self).save(*args, **kwargs) 
     if self.body: 
      body = self.body 
      obj_id = self.id 
      add_tags(obj_id, body) 

Also, wenn ein Benutzer Post etwas, würde ich prüfen möchte, ob es einen Hash ist Etikett innerhalb des Körpers verwendet. Wenn Tags vorhanden sind, rufen Sie die Tags in der Liste ab.

Aber wenn ich bin Entsendung werden die Tag-Objekte erstellt, aber sie sind nicht das Hinzufügen für die Post.tags Felder aus.

post.body Beispiel = Überprüfen Sie #von http://somesitedotcom/page#idtop #hell yeah!

Was mache ich hier falsch?

+1

Pro-Tipp: Sie müssen nicht [bitte helfen Sie mir] hinzufügen müssen (https://stackoverflow.com/search?q=user%3A2634889+please+help+me) oder ähnlich, um alle Ihre Fragen. Es ist klar, dass Sie Hilfe benötigen, daher kann Füllmaterial dieser Art als Betteln interpretiert werden, und es wird oft von Editoren sowieso getrimmt. – halfer

+1

@halfer Ok, verstanden. Vielen Dank. – Robin

Antwort

0

Sie können nicht zuordnen Post mit einem tag bis es gespeichert:

def save(self, *args, **kwargs): 
    super(Post, self).save(*args, **kwargs) 
    if self.body: 
     tag_list = [word for word in self.body.split() if word.startswith("#")] 
     self.body = tag_list 
     self.tags.add(*tag_list) 
+0

Ja, ich erhalte jetzt den vorherigen Fehler nicht. Aber stattdessen bekomme ich diesen Fehler: 'ungültiges Literal für int() mit Basis 10: '# hell'' – Robin

0

Dies ist ein häufiger von Menschen gemacht Fehler. Um die m2m-Beziehung eines Modellobjekts zu aktualisieren, muss das Objekt zuerst in der Datenbank gespeichert werden. Django m2m verwendet im Wesentlichen eine Zwischentabelle, um die Beziehung zu speichern, sodass ohne die Speicherung der beiden Enden die Beziehung nicht gebildet werden kann.

Ich würde nicht auf save() Methode überschreiben, um dies zu erreichen, sondern eher mit diesem Prozess separat in Views-Methode, weil save() kann in jeder Situation passieren, aber Sie könnten nicht immer was dieser Prozess passieren. Aus Gründen der Richtigkeit sollten Sie es tun, nachdem Sie super(Post, self).save(*args, **kwargs) in der save Methode aufrufen.

Edit:

Klingt wie Ihr Code ist auch fehlerhaft. tag_list ist eine Liste von Zeichenfolgen, aber Ihr Code self.tags.add(*tag_list) behandelt sie als Tag Objekte. Sie müssen Tag Objekte erstellen und dann add verwenden, um die Beziehung zu verknüpfen.

+0

Ok, also habe ich die save() Methode geändert. Aber ich bekomme diesen Fehler: 'ungültiges Literal für int() mit Basis 10: '# hell'' – Robin

+0

Ich habe meine Antwort bearbeitet, um Ihr Problem anzugehen. Sehen Sie, ob es Sinn macht. –

+0

Ich habe die Frage aktualisiert. – Robin