2011-11-23 79 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