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

发布于 2024-12-17 12:11:56 字数 910 浏览 2 评论 0原文

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

您能建议我如何修复它吗?

I'm a newbie in Django, so can you help me to understand how the save() method works?

Here's my models:

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)

There is tags_string where user enters tags separated by comma. It's just a string.

Then I'm trying to add tags to ManyToManyField by clicking "Save" in Django admin:

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)

but it doesn't work. entry.tags.add(t) works perfectly through the Django shell - it adds the values to the database. I think that something is wrong in my save() method.

Could you suggest me how to fix it, please?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

还如梦归 2024-12-24 12:11:56

试试这个

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

try this

def save(self):
    super(Entry, self).save()
    if self.tags_string:
        for tag in tags_string.split(","):
            self.tags.create(name=tag)
作死小能手 2024-12-24 12:11:56

检查 M2M 标签格式并打印它们?

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

Check the M2M tags format and print those?

def save(self):
   super(Entry, self).save()
   if self.tags_string:
       print self.tags,type(self.tags)   
       for tag in tags_string.split(","):
          .......
梦一生花开无言 2024-12-24 12:11:56

首先,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.defaultfilters< 中的 str.lower()title() 对标签进行某种标准化。 /代码>。否则,您最终会得到“Tag”、“tag”、“TAG”和“tAg”。

First, save has additional parameters that you need to account for. Second, you should be using get_or_create instead of create for the tags:

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)

Those may not fix the current issue, but it would have got you eventually.

You should also probably be doing some sort of normalization on the tags as well, using str.lower() or title() from django.template.defaultfilters. Otherwise, you'll end up with "Tag", "tag", "TAG" and "tAg".

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文