Django ModelAdmin保存数据库字段

时间:2015-11-20 19:39:10

标签: python django mezzanine

我试图在modelAdmin中使用modelForm来更改数据库字段。 IteAdmin是从mezzanine's blog admin

复制的
class YourModelForm(forms.ModelForm):

    send_email = forms.BooleanField(required=False)

    def email(self, model, commit=True):
        send_email = self.cleaned_data.get('send_email', None)
        content = self.cleaned_data.get('content', None)
        if send_email == True:
            mod = Ite.objects.get(id=self.instance.id)
            print mod.email_recipients #>'NOT SENT'
            mod.email_recipients = 'EMAIL SENT'
            mod.save() # this does nothing
            print mod.email_recipients #> 'EMAIL SENT'
        return super(YourModelForm, self).save(commit=commit)


class IteAdmin(TweetableAdminMixin, DisplayableAdmin, OwnableAdmin, admin.ModelAdmin):
    form = YourModelForm
    def save_form(self, request, forms, change):
        OwnableAdmin.save_form(self, request, forms, change)
        DisplayableAdmin.save_form(self, request, forms, change)
        return YourModelForm.email(forms,self)

我认为价值' EMAIL SENT'正在被其他保存所覆盖?我对modeladmins来说是全新的,真的很挣扎。 基本上,如果选中复选框,我想发送电子邮件,然后更新模型(Ite),以便它显示已发送电子邮件。我建议我使用信号来实现我将要做的电子邮件部分,但我需要弄清楚如何首先更新模型。任何帮助都非常感激

1 个答案:

答案 0 :(得分:0)

这里有一些问题。

  1. 您不应该使用课程super().save()方法以外的任何方式致电save()
  2. 您发送电子邮件的解决方案(接收器稍后会检查模型上的字段)非常糟糕。如果可能的话,我会尝试另一条路线。例如:
  3. ModelForm save()中停止不必要地弄乱你的模特。事实上,请发送电子邮件'完全放弃了。在实际发送电子邮件的表单上写一个email()方法。然后,只要您想发送电子邮件,就可以调用该方法。如果您希望它自动发生,请覆盖您的表单save()和(使用super()后让ModelForm执行其操作)如果用户有email()勾选send_email字段。