【问题标题】:Adding values in ManyToManyField through the Django admin通过 Django 管理员在 ManyToManyField 中添加值
【发布时间】:2012-01-04 15:30:45
【问题描述】:

我是 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() 方法有问题。

您能建议我如何解决它吗?

【问题讨论】:

  • 你在哪里填写self.tags_string
  • 在 django 管理员中。它只是一个稍后在 save() 方法中解析的 CharField。
  • 我会尝试print self.tags_string .. 也许有问题。其他一切似乎都是正确的
  • print self.tags_string 返回字符串。没关系。此外,标签在此处成功创建:t = Tag.objects.create(name=tag) 并保存在数据库中。但关系表 entry_tags 为空。
  • 我有时在 django 中看到 m2m 字段的奇怪行为...如果您切换到不同的数据库(例如 sqlite?),它的行为是否完全不同?或者,你能做一个最小的复制,没有其他代码吗?

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


【解决方案1】:

试试这个

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

【讨论】:

    【解决方案2】:

    检查 M2M 标签格式并打印?

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

    【讨论】:

    • print self.tags,type(self.tags) 返回:
    【解决方案3】:

    首先,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”、“tag”、“TAG”和“tAg”。

    【讨论】:

    • 非常感谢,克里斯。它仍然不起作用,但看起来好多了:)
    猜你喜欢
    • 2013-03-17
    • 1970-01-01
    • 2015-01-23
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多