pythondjangom2mdjango-orm

ManyToMany field not saved when using Django admin


I'm experiencing a weird problem which I hope someone in here may be able to shed some light on.

I'm overriding the save() method of a model to add some values to a ManyToMany-field after running super(). My problem is that when I'm saving in Django admin the values seems to get added to the relationship but is then empty again.

If however I do it from manage.py shell it works without problem.

I've put two print statements in there and they produce the exact same output regardless of if I'm running it via Django admin or via shell.

class Store(models.Model):
    holidays = models.ManyToManyField(StoreHoliday, blank=True)
    copy_holidays_from = models.ForeignKey('Store', blank=True, null=True)

    def save(self):
        print '====  BEFORE SAVE:', self.holidays.all()
        super(Store, self).save()
        self.copy_holidays()
        print '====  AFTER SAVE:', self.holidays.all()

    def copy_holidays(self):
        if self.pk and self.copy_holidays_from:
            self.holidays.clear()
            for h in self.copy_holidays_from.holidays.all():
                self.holidays.add( h )

This is the output of the print statements:

====  BEFORE SAVE: []
====  AFTER SAVE: [<StoreHoliday: 10 Mar 2010, Chuck Norris birthday (Closed)>]

Does anyone have any suggestions on what might be causing this?

Edit: All manual changes to the m2m relationship in save() seems to be discarded by Django when saving through the admin interface. Is this related to how it processes the form?


Solution

  • So it turns out the above was not the correct way to implement it. The code belonged in StoreAdmin, by overriding model_save().

    This is how I solved it:

    class StoreAdmin(admin.ModelAdmin):
        def save_model(self, request, obj, form, change):
            if obj.copy_holidays_from:
                form.cleaned_data['holidays'] = obj.copy_holidays_from.holidays.all()
    
            super(StoreAdmin, self).save_model(request, obj, form, change)