尝试在 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' 字段。这解决了问题。