2014-04-17 141 views
0

当我从管理面板添加一个新的横幅时,我想在其创建横幅关联的关键字不会被添加到数据库中。Django模型覆盖保存功能不更新数据库中的m2m字段

class Banners(models.Model): 
    objects = BannerManager() 
    banner_location = models.ManyToManyField(BannerLocation, verbose_name=_("Banner's Location"), default=None, null=True, blank=True) 
    keywords = models.ManyToManyField(Keywords, verbose_name=_("Banner's Related Keywords"), null=True, blank=True) 
    width = models.IntegerField(verbose_name=_("Banner Width"), null=False, blank=False) 
    height = models.IntegerField(verbose_name=_("Banner Height"), null=False, blank=False) 
    invocation_code = models.TextField(verbose_name=_("Banner Height"), null=False, blank=False) 
    is_enable = models.BooleanField(verbose_name=_("Is Enable"), default=False) 
    banner_updated = models.DateTimeField(auto_now=True) 
    banner_created = models.DateTimeField(auto_now_add=True) 

    class Meta: 
     verbose_name = "Banner" 
     verbose_name_plural = "Banners" 
     ordering = ['-banner_updated', 'is_enable'] 

    def __unicode__(self): 
     return "width: %s, height: %s" % (self.width, self.height) 

    def save(self): 
     is_new = False 
     if self.pk is None: 
      is_new = True 
     super(Banners, self).save() 
     if is_new == True: 
      keyword = Keywords.objects.get(pk=1) 
      self.keywords.add(keyword) 

回答

1

如果你在你的管理形式keywords领域发生的事情是这样的:

  1. 你按你的新Banners实例保存在admin(有没有选择的关键字)
  2. Django管理模型表格保存Banners实例
  3. 您的覆写save方法添加您的关键字
  4. Dj安戈管理员所设定的关键字M2M领域中的表单提交任何关键字(代替你在保存的方法中设置)

原因Django的做,这是因为,如你所知,在Banners实例被拯救在可以添加m2m关系之前。

我已经围绕在这个圈子里,在过去与m2m_changed信号等混淆......但是你很可能最终得到的东西只能在Django管理站点的狭窄环境下工作,在其他代码中没有意义。

你的保存方法是工作,我认为(尝试在一个控制台,Django管理外),你真正需要的是自定义管理形式的行为:

class BannersForm(forms.ModelForm): 
    class Meta: 
     model = Banners 

    def __init__(self, *args, **kwargs): 
     if kwargs.get('instance') is None: 
      # create new Banners 
      initial = kwargs.get('initial', {}) 
      initial.update({'keywords': Keywords.objects.filter(pk=1)}) 
      kwargs['initial'] = initial 
     super(BannersForm, self).__init__(*args, **kwargs) 


class BannersAdmin(admin.ModelAdmin): 
    form = BannersForm 


admin.site.register(Banners, BannersAdmin) 
相关问题