我是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()方法出了问题。
你能告诉我如何解决它吗?
答案 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”。