通过Django管理员在ManyToManyField中添加值

时间:2011-11-23 10:20:24

标签: django django-models django-admin django-orm

我是Django的新手,你能帮我理解save()方法是如何工作的吗?

这是我的模特:

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()方法出了问题。

你能告诉我如何解决它吗?

3 个答案:

答案 0 :(得分:1)

试试这个

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

答案 1 :(得分: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(","):
          .......

答案 2 :(得分: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)

这些可能无法解决当前的问题,但它最终会帮助你。

您也应该使用str.lower()中的title()django.template.defaultfilters对标记进行某种规范化。否则,你最终会得到“Tag”,“tag”,“TAG”和“tAg”。

相关问题