2016-08-23 73 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) 

當試圖創建新的內容,只是「標題」字段中呈現。這解決了這個問題。