2016-04-08 45 views
0

我使用Django 1.7.11。我有模型:Django,保存更改模型時爲ManyToManyField添加值

#I use django-categories app here 
class Category(CategoryBase): 
    pass 

class Advertisment(models.Model): 
    title = models.CharField(max_length=255, blank=True) 
    category = models.ForeignKey(Category, related_name='category') 
    all_categories = models.ManyToManyField(Category, blank=True, related_name='all_categories') 

我需要字段「all_categories」包含「類別」和它的所有父類別。我試圖使用post_save,但它不會改變任何值。它甚至不會更改標題字段。當我通過管理界面創建模型並使用自定義窗體時,它不起作用。

@receiver(post_save, sender=Advertisment, dispatch_uid="update_stock_count") 
def update_stock(sender, instance, **kwargs):  
categ = instance.category  
instance.all_categories.add(categ)   
for parent in categ.get_ancestors(): 
      if parent not in instance.all_categories.all(): 
        instance.all_categories.add(parent) 

m2m_changed也沒有幫助,因爲ManyToManyField爲空且沒有更改。我如何將ForeignKey中的值添加到ManyToMany字段?我應該怎麼做才能在管理界面中工作。

+0

你的'post_save'被調用了嗎? –

+0

是的,現在我注意到它可以在自定義窗體中正常工作,並且不適用於管理界面。我能用管理員表單做什麼?) – Swallow

回答

0

我找到了解決方案。在管理員類中需要添加一個像這樣的函數save_model:

class AdvertismentAdmin(admin.ModelAdmin): 
    def save_model(self, request, obj, form, change):     
     if obj.category: 
     category_list=[] 
     category = obj.category 
     category_list.append(category) 
     for parent in category.get_ancestors(): 
      if parent not in category_list: 
       category_list.append(parent) 
     form.cleaned_data['all_categories'] = category_list    
     super(AdvertismentAdmin, self).save_model(request, obj, form, change)