尝试使用Django中的post_save建立m2m关系时,Add方法不起作用

时间:2016-08-23 18:48:38

标签: django django-models many-to-many django-orm

我的Content模型与many-to-many模型的关系Tag。当我保存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中创建一个Content对象可以完美地运行。因此,问题在于管理面板的设置。

1 个答案:

答案 0 :(得分:0)

好的,我解决了这个问题。基本上,这与Django如何在管理面板中处理其表单有关。当我尝试从admin添加内容时,我将标记字段保留为空,认​​为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)

尝试创建新内容时,仅显示“标题”字段。这解决了这个问题。