Беда твоя в админке. Автоматическое поле для tags автоматически тэги удаляет.
Если можно в твоей ситуации это поле безболезненно удалить, советую это сделать.
Ну и помощь:
class Tag(models.Model):
name = models.CharField(verbose_name=u'Tag', max_length=200, unique=True)
def __unicode__(self):
return self.name
class Entry(models.Model):
title = models.CharField(verbose_name=u'Entry title', max_length=200)
tags_string = models.CharField(verbose_name=u'Tags', max_length=200, blank=True)
# Обрати внимание на editable=False
tags = models.ManyToManyField(Tag, null=True, blank=True, editable=False)
def __init__(self, *args, **kwargs):
super(Entry, self).__init__(*args, **kwargs)
# Инициализируем строку ``tags_string`` значениями тэгов
if self.pk:
self.tags_string = ', '.join(self.tags.values_list('name', flat=True))
def save(self, *args, **kwds):
super(Entry, self).save(*args, **kwds)
names = set([name.strip() for name in self.tags_string.split(',')])
current = set(self.tags.values_list('name', flat=True))
# Не только добавляй, но и удаляй тэги
exclude = current - names
for name in names:
tag, created = Tag.objects.get_or_create(name=name)
self.tags.add(tag)
for name in exclude:
tag = Tag.objects.get(name=name)
self.tags.remove(tag)
админка:
class EntryAdmin(admin.ModelAdmin):
model = Entry
list_display = ('title', 'tag_list')
def tag_list(self, obj):
return ', '.join(obj.tags.values_list('name', flat=True))
admin.site.register(Entry, EntryAdmin)
И не хочешь ли ты использовать
django-taggit или
django-tagging?