2012-09-19 75 views
2

我想查看更改的数据,如果有任何字段已更改,我想将其邮寄给管理员电子邮件。Django表单获取更改字段

这里是我的代码:

def send_change_email(changed_data, cleaned_data, merchant): 
    changed_stuff = {} 
    for key in changed_data: 
     changed_stuff[key] = cleaned_data[key] 
    rendered = render_to_string('model_change.txt', {'changed_stuff':changed_stuff, 'merchant':merchant }) 
    send_mail('Model Change!', rendered, '[email protected]', ['[email protected]'])  

class FooForm(forms.Form): 
    field_1 = forms.CharField() 
    field_2 = forms.CharField() 

    def clean(self): # Here I test if any field is changed, if so, mail to them 
     if self.is_valid() and self.changed_data: 
      send_change_email(self.changed_data, self.cleaned_data, None) 
     return self.cleaned_data  

的问题是,我总是领域的完整列表,当我尝试self.changed_data。我怎样才能克服这个问题?

+0

当数据保存在数据库中时发送电子邮件没有更多的意义,而不是在表单中更改?看起来像垃圾邮件机器; ;-) –

+0

'changed_data'是相对于Django中的'initial',每个字段在用户呈现表单时的值。当你实例化你的Form时,你可以提供'initial'(如果对象已经存在,Django会自动为你执行'ModelForm')。如果您不提供'initial',则所有字段都将被视为已更改。 –

回答

0

也许你可以试试这个snippet,如果问题依然存在,你可能在初始化或提交表单时遇到问题。

+0

前一个链接不再有效。 –

+0

如果你在模型表单上使用它,它会正常工作,我测试过了。 self.changed_data仅包含已更改的字段。我唯一遇到的问题是FileBrowserField(django-filebrowser),它似乎每次都会更新。 – radtek