как сделать автоматическое добавление тегов к посту
Подскажите пожалуйста , есть ли способ добавлять экземпляры класса ManytoMany в django автоматически все.Н.п добавлять все теги какие есть к посту во время его создания автоматически , не выбирая их в ручную.
Ответы (1 шт):
Допустим у нас есть две модели
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())
реализовать твое поведение мы можем несколькими способами
При редактировании сделать так, что бы автоматически поле tags было заполнено всеми тегами из модели Tag и позволить пользователю что-то исключить при необходимости. Для реализации этого способа мы в форме, указанной ниже, переопределим
__init__Сделать так, что бы при сохранении нового 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