Python Django model override save函数不更新数据库中的m2m字段
当我从管理面板添加一个新的横幅时,我想在创建时与横幅关联的关键字不会添加到db中Python Django model override save函数不更新数据库中的m2m字段,python,django,model,Python,Django,Model,当我从管理面板添加一个新的横幅时,我想在创建时与横幅关联的关键字不会添加到db中 class Banners(models.Model): objects = BannerManager() banner_location = models.ManyToManyField(BannerLocation, verbose_name=_("Banner's Location"), default=None, null=True, blank=True) keywords =
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)
如果您的管理表单中有
关键字
字段,则会发生以下情况:
横幅实例上按“保存”(未选择任何关键字)
横幅
实例save
方法会添加关键字banner
实例
过去,我自己也曾在这方面做过一些周折,处理m2m\u更改的signal等。。。但是,在Django管理站点中,您很可能会得到一些只在有限的环境中有效的东西,但在其他代码中没有意义
我认为您的save方法正在工作(在控制台中,在Django admin之外尝试),您真正需要的是定制管理表单的行为:
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)