Отношения объекта ManyToMany не обновляются внутри сигналов
У меня есть этот сингал
@receiver(post_save, sender=Organization)
def save_tags(sender, instance, **kwargs):
from .views import post
text_input_tags = post.getlist('tags1')[0]
text_input_tags = text_input_tags.strip()
text_inputs_tags = text_input_tags.split(' ')
for tag in text_inputs_tags:
if not tag.startswith('#') :
tag = '#' + tag
tag_obj = Tag.objects.get_or_create(name = tag)[0]#.organization_set.set([obj,])
tag_obj.save()
instance.tags.add(tag_obj)
print(instance.tags.all())
из представлений я импортирую данные постов для использования внутри сигнала. Существует множество отношений между двумя моделями Organization и Tag. Я пытаюсь получить некоторые атрибуты из почтового запроса и создать из них объект Tag, а затем добавить этот объект Tag в отношение ManyToMany экземпляра Organization. Когда я печатаю теги экземпляра организации
print(instance.tags.all())
Я получаю добавленные экземпляры в QuerySet, но они не сохраняются в экземпляре организации, и я не понимаю, почему... Я попытался сделать ту же функциональность внутри метода UpdateView организации, но он делал точно то же самое и не работал. Вот UpdateView и его методы, которые не работают с этой функциональностью
class OrganizationUpdate(UpdateView):
model = Organization
'''fields = [
'name',
'slug',
'bio',
'avatar_thumbnail',
'location',
'tags',
'contact_information'
]'
'''
form_class = forms.OrganizationForm
def get_object(self):
obj = Organization.objects.get(slug = self.kwargs.get('slug'))
if self.request.user not in obj.moderators.all() :
raise exceptions.PermissionDenied()
return obj
def save(self, *args, **kwargs):
org = self.get_object()
POST = self.request.POST.copy()
text_input_tags = POST.getlist('tags1')[0]
text_input_tags = text_input_tags.strip()
text_inputs_tags = text_input_tags.split(' ')
for tag in text_inputs_tags:
print(tag)
if not tag.startswith('#') :
tag = '#' + tag
tag_obj = Tag.objects.get_or_create(name = tag)[0]
tag_obj.save()
org.tags.add(tag_obj)
return super().save(*args, **kwargs)
def post(self, request, *args, **kwargs):
# same functionality in save()
return super().post(request, *args, **kwargs)
def form_valid(self, form):
# same functionality in save()
return super().form_valid(form)
На самом деле мне нужно было реализовать эту функциональность после сохранения экземпляра, поэтому методы post или form_valid здесь не подходят, мне нужно было реализовать ее внутри метода, который происходит в последних частях updateview, мой выбор был внутри get_success_url, код выглядит следующим образом:
def get_success_url(self):
org = self.get_object()
POST = self.request.POST.copy()
text_input_tags = POST.getlist('tags1')[0]
text_input_tags = text_input_tags.strip()
text_inputs_tags = text_input_tags.split(' ')
for tag in text_inputs_tags:
print(tag)
if not tag.startswith('#') :
tag = '#' + tag
tag_obj = Tag.objects.get_or_create(name = tag)[0]
tag_obj.save()
org.tags.add(tag_obj)
return super().get_success_url()