2016-04-08 2 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" содержит "category" и все его родительские категории. Я пытался использовать post_save, но он не меняет никакого значения. Он даже не меняет заголовок. Это не сработает, когда я создаю интерфейс API-интерфейса модели и работает с пользовательской формой.

@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) 
Смежные вопросы