尝试在 Django 中使用 post_save 建立 m2m 关系时添加方法不起作用
Add method doesnt work when trying to establish m2m relationships using post_save in Django
我的 Content
模型与 Tag
模型有 many-to-many
关系。当我保存 Content
对象时,我想动态添加关系。我正在按照以下方式执行此操作。
def tag_content(obj):
for tag in Tag.objects.all():
print tag
obj.tags.add(tag)
obj.is_tagged = True
obj.save()
class Tag(models.Model):
name = models.CharField(max_length=255)
class Content(models.Model):
title = models.CharField(max_length=255)
is_tagged = models.BooleanField(default=False)
tags = models.ManyToManyField(Tag, blank=True)
def save(self, *args, **kwargs):
super(Content, self).save(*args, **kwargs)
@receiver(post_save, sender = Content)
def update_m2m_relationships_on_save(sender, **kwargs):
if not kwargs['instance'].is_tagged:
tag_content(kwargs['instance'])
tag_content
函数运行,但是m2m
关系没有建立。我正在使用 Django 1.9.8 顺便说一下。这是没有意义的。我错过了什么?此外,如果我在 shell 中执行类似 tag_content(content_instance)
的操作,则标签已设置,因此功能正常。我想问题出在接收器上。有什么帮助吗?
编辑
我的问题与 m2m_changed 无关,正如我所说,在 shell 中创建内容对象非常有效。因此,问题出在管理面板的设置上。
好的,我解决了这个问题。基本上,这与 Django 在管理面板中处理其表单的方式有关。当尝试从管理员添加内容时,我将标签字段留空,认为 tag_content 函数可以处理它。然而,这正是问题所在,因为从 shell 标记创建内容就很好。换句话说,将管理面板更改为这样的东西解决了我的问题:
from django.contrib import admin
from myapp.models import *
from django import forms
class ContentCreationForm(forms.ModelForm):
class Meta:
model = Content
fields = ('title',)
class ContentChangeForm(forms.ModelForm):
class Meta:
model = Content
fields = ('title', 'is_tagged', 'tags')
class ContentAdmin(admin.ModelAdmin):
def get_form(self, request, obj=None, **kwargs):
if obj is None:
return ContentCreationForm
else:
return ContentChangeForm
admin.site.register(Tag)
admin.site.register(Content, ContentAdmin)
尝试创建新内容时,仅显示 'title' 字段。这解决了问题。
我的 Content
模型与 Tag
模型有 many-to-many
关系。当我保存 Content
对象时,我想动态添加关系。我正在按照以下方式执行此操作。
def tag_content(obj):
for tag in Tag.objects.all():
print tag
obj.tags.add(tag)
obj.is_tagged = True
obj.save()
class Tag(models.Model):
name = models.CharField(max_length=255)
class Content(models.Model):
title = models.CharField(max_length=255)
is_tagged = models.BooleanField(default=False)
tags = models.ManyToManyField(Tag, blank=True)
def save(self, *args, **kwargs):
super(Content, self).save(*args, **kwargs)
@receiver(post_save, sender = Content)
def update_m2m_relationships_on_save(sender, **kwargs):
if not kwargs['instance'].is_tagged:
tag_content(kwargs['instance'])
tag_content
函数运行,但是m2m
关系没有建立。我正在使用 Django 1.9.8 顺便说一下。这是没有意义的。我错过了什么?此外,如果我在 shell 中执行类似 tag_content(content_instance)
的操作,则标签已设置,因此功能正常。我想问题出在接收器上。有什么帮助吗?
编辑
我的问题与 m2m_changed 无关,正如我所说,在 shell 中创建内容对象非常有效。因此,问题出在管理面板的设置上。
好的,我解决了这个问题。基本上,这与 Django 在管理面板中处理其表单的方式有关。当尝试从管理员添加内容时,我将标签字段留空,认为 tag_content 函数可以处理它。然而,这正是问题所在,因为从 shell 标记创建内容就很好。换句话说,将管理面板更改为这样的东西解决了我的问题:
from django.contrib import admin
from myapp.models import *
from django import forms
class ContentCreationForm(forms.ModelForm):
class Meta:
model = Content
fields = ('title',)
class ContentChangeForm(forms.ModelForm):
class Meta:
model = Content
fields = ('title', 'is_tagged', 'tags')
class ContentAdmin(admin.ModelAdmin):
def get_form(self, request, obj=None, **kwargs):
if obj is None:
return ContentCreationForm
else:
return ContentChangeForm
admin.site.register(Tag)
admin.site.register(Content, ContentAdmin)
尝试创建新内容时,仅显示 'title' 字段。这解决了问题。