как сделать автоматическое добавление тегов к посту

Подскажите пожалуйста , есть ли способ добавлять экземпляры класса ManytoMany в django автоматически все.Н.п добавлять все теги какие есть к посту во время его создания автоматически , не выбирая их в ручную.


Ответы (1 шт):

Автор решения: Andrey Maslov

Допустим у нас есть две модели

class Tag(models.Model):
    name = models.CharField(max_length=200)

    def __str__(self):
        return self.name


class Post(models.Model):
    tags = models.ManyToManyField(Tag, blank=True)

    def __str__(self):
        return str(self.tags.all())

реализовать твое поведение мы можем несколькими способами

  1. При редактировании сделать так, что бы автоматически поле tags было заполнено всеми тегами из модели Tag и позволить пользователю что-то исключить при необходимости. Для реализации этого способа мы в форме, указанной ниже, переопределим __init__

  2. Сделать так, что бы при сохранении нового Post, если пользователь не указал ничего в поле tag, то автоматически заполнять его. Для реализации этого способа мы в форме переопределим clean

class PostAdminForm(ModelForm):
    def __init__(self, *args, **kwargs):
        if kwargs.get('instance') is None:
            initial = kwargs.get('initial', {})
            initial['tags'] = Tag.objects.all()
        super().__init__(*args, **kwargs)

    def clean(self):
        cleaned_data = super().clean()
        if self.instance.pk is None and not cleaned_data.get('tags'):
            cleaned_data['tags'] = Tag.objects.all()
        return cleaned_data

    class Meta:
        model = Post
        fields = '__all__'

В данном случае, так как форма содержит оба переопределенных метода, то будет поддерживаться поведение описанное и в пункте 1 и в пункте 2. Если тебе нужен только один из способов, то можешь удалить лишний для тебя метод.

Данную форму ты сможешь использовать для редактирования как в админке, так и в обычных view

→ Ссылка