2011-11-23 78 views
0

我是Django的新手,你能幫我理解save()方法的工作原理嗎?通過Django admin在ManyToManyField中添加值

這裏是我的模型:

class Tag(models.Model): 
    name = models.CharField(verbose_name=u'Tag', max_length=200, unique=True) 

class Entry(models.Model): 
    title = models.CharField(verbose_name=u'Entry title', max_length=200) 
    # some more fields here 
    tags_string = models.CharField(verbose_name=u'Tags', max_length=200, blank=True) 
    tags = models.ManyToManyField(Tag, blank=True) 

tags_string,其中用戶輸入以逗號分隔標籤。這只是一個字符串。

然後我試圖通過點擊「保存」在Django管理添加標籤ManyToManyField:

def save(self): 
    super(Entry, self).save() 
    if self.tags_string: 
     for tag in tags_string.split(","): 
      t = Tag.objects.create(name=tag) 
      self.tags.add(t) 

,但它不工作。 entry.tags.add(t)通過Django shell完美工作 - 它將值添加到數據庫。我認爲我的save()方法有問題。

您能否建議我如何解決它?

+0

你在哪裏填寫'self.tags_string'? – juliomalegria

+0

在django管理員。它只是一個CharField,稍後在save()方法中進行解析。 – elky

+0

我會嘗試'打印self.tags_string' ..也許有問題。其他一切似乎都正確 – juliomalegria

回答

1

試試這個

def save(self): 
    super(Entry, self).save() 
    if self.tags_string: 
     for tag in tags_string.split(","): 
      self.tags.create(name=tag) 
+0

沒有影響 - relaiton表entry_tags爲空:( – elky

0

檢查M2M標籤格式和打印這些?

def save(self): 
    super(Entry, self).save() 
    if self.tags_string: 
     print self.tags,type(self.tags) 
     for tag in tags_string.split(","): 
      ....... 
+0

print self.tags,類型(self.tags)返回: .fields.related.ManyRelatedManager'> – elky

0

首先,save有你需要考慮額外的參數。其次,你應該使用get_or_create代替create的標籤:

def save(self, *args, **kwargs): 
    super(Entry, self).save(*args, **kwargs) 
    if self.tags_string: 
     for tag in tags_string.split(","): 
      t, created = Tag.objects.get_or_create(name=tag) 
      self.tags.add(t) 

那些可能無法解決目前的問題,但它會得到你最終。

您也應該對標籤進行某種標準化處理,使用django.template.defaultfiltersstr.lower()title()。否則,您將以「標籤」,「標籤」,「標籤」和「tAg」結束。

+0

非常感謝,Chris。它仍然不起作用,但看起來好多了:) – elky