Django ModelAdmin 保存数据库字段

Django ModelAdmin saving database field

我正在尝试使用 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' 正在被其他保存覆盖?我是模型管理员的新手,真的很挣扎。 基本上,如果复选框被选中,我想发送一封电子邮件,然后更新模型 (Ite),以便显示电子邮件已发送。建议我使用信号来实现我将要做的电子邮件部分,但我需要先弄清楚如何更新模型。非常感谢任何帮助

这里有一些错误。

  1. 您不应该从 class 的 save() 方法以外的任何地方调用 super().save()
  2. 您发送电子邮件的解决方案(接收者稍后会检查模型上的一个字段)非常老套。如果可能的话,我会尝试另一条路线。例如:

停止在 ModelFormsave() 中不必要地弄乱您的模型。事实上,完全去掉 'email sent' 字段。在真正发送邮件的表单上写一个email()方法。然后,只要您想发送电子邮件,就可以调用该方法。如果你想让它自动发生,覆盖你的表单的 save() 并且(在使用 super()ModelForm 做它的事情之后)调用 email() 如果用户勾选了 send_email字段。