Профиль пользователя заблокирован сроком «навсегда» без указания причины
Ответы пользователя по тегу Django
  • Django - как добавить значение в ManyToManyField через админку?

    summerisgone
    @summerisgone
    Беда твоя в админке. Автоматическое поле для 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?
    Ответ написан
    1 комментарий