当使用Django管理员时,ManyToMany字段未保存 [英] ManyToMany field not saved when using Django admin

查看:178
本文介绍了当使用Django管理员时,ManyToMany字段未保存的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在经历一个奇怪的问题,我希望有人在这里可能有一些光明。



我覆盖了save()方法在运行super()之后,将一些值添加到ManyToMany字段。我的问题是,当我保存Django管理员时,值似乎被添加到关系中,但是再次为空。



如果我从 manage.py shell 它的工作没有问题。



我已经在其中放置了两个打印语句,它们产生完全相同的无论我是否通过Django管理员或通过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):
如果self.pk和self.copy_holidays_from:
self。 self.copy_holi中的h.c中的days_from.holidays.all():
self.holidays.add(h)

print 语句的输出:

  ==== BEFORE SAVE:[] 
==== AFTER SAVE:[< StoreHoliday:2010年3月10日,Chuck Norris生日(已关闭)>]



编辑:当通过管理界面保存时,所有手动更改save()中的m2m关系似乎都被Django丢弃。这是否与处理表单有关?

解决方案

所以结果是上述不是正确的方法来实现。代码属于StoreAdmin,覆盖了model_save()。



这是我如何解决的:

 类StoreAdmin(admin.ModelAdmin):
def save_model(self,request,obj,form,change):
如果obj.copy_holidays_from:
form.cleaned_data ['holidays'] = obj.copy_holidays_from.holidays.all()

super(StoreAdmin,self).save_model(request,obj,form,change)


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?

解决方案

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)

这篇关于当使用Django管理员时,ManyToMany字段未保存的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆