2016-08-23 72 views
0
使用post_save M2M关系时添加方法行不通

Content模式有many-to-many关系到Tag模型。当我保存Content对象时,我想动态添加关系。我以下面的方式来做这件事。试图建立在Django

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 btw。这没有意义。我错过了什么?此外,如果我在shell中执行诸如tag_content(content_instance)之类的操作,那么将设​​置标记,因此该函数可以正常工作。我想问题在于接收器。任何帮助?

编辑

我的问题无关m2m_changed,正如我刚才所说,创造壳内容对象的作品完美。因此,问题在于管理面板的设置。

+0

你可以验证'update_m2m_relationships_on_save'是否被调用,并且它正在接收正确的kwargs?这就是我个人的调试方式。因为你似乎已验证所有其他作品... – shark3y

+0

是的。 'print tag'就是这样,是的,save方法正在调用update_m2m方法。 –

+0

尝试在接收者的'if'语句之前打印'kwargs ['instance']'和'kwargs ['instance']。is_tagged',以确保对象和布尔值都是你期望的 – souldeux

回答

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) 

当试图创建新的内容,只是“标题”字段中呈现。这解决了这个问题。