Добавление значений в ManyToManyField через администратора Django - PullRequest
0 голосов
/ 23 ноября 2011

Я новичок в 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где пользователь вводит теги, разделенные запятой.Это просто строка.

Затем я пытаюсь добавить теги в ManyToManyField, нажав «Сохранить» в админке Django:

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 - она ​​добавляет значения в базу данных.Я думаю, что что-то не так в моем методе save ().

Не могли бы вы подсказать, как это исправить, пожалуйста?

Ответы [ 3 ]

1 голос
/ 23 ноября 2011

попробуйте

def save(self):
    super(Entry, self).save()
    if self.tags_string:
        for tag in tags_string.split(","):
            self.tags.create(name=tag)
0 голосов
/ 23 ноября 2011

Во-первых, 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».

0 голосов
/ 23 ноября 2011

Проверить формат тегов M2M и распечатать их?

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