Django的。在管理表单的覆盖保存方法中获取保存值

时间:2013-10-31 15:24:34

标签: django django-forms django-admin

使用覆盖保存方法的管理表单:

*models.py
class Banners(models.Model):
    <...>
    pages = models.ManyToManyField(Page, verbose_name='Pages', blank=True)

*forms.py
class BannerAdminForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super(BannerAdminForm, self).__init__(*args, **kwargs)
        self.fields['pages'].queryset = Page.objects.filter(publisher_is_draft=1)

    def save(self, force_insert=False, force_update=False, commit=True, *args, **kwargs):
        banner = super(BannerAdminForm, self).save(commit=False, *args, **kwargs)

        for c in banner.pages.all():
            print c

        if commit:
            banner.save()
        return banner

    class Meta:
        model = Banners

我覆盖 save()方法,因为我想拦截将添加到横幅页面,并添加一些额外的页面取决于用户选择的页面。所以我需要抓住哪些页面对象被选中......但是在banner.pages.all()中的代码 for c:会在横幅中返回已经存在的页面,而不是新的页面。 如果有一些方法可以在 save()表单之前捕获新值吗?

第二个问题 - 如果出现了一些新页面并同时删除了一些旧页面......是否会有相同的机制来捕获所有数据?

1 个答案:

答案 0 :(得分:1)

您应该能够从表单cleaned_data中选择页面。

self.cleaned_data['pages']