通过Django模板将对象传递给javascript

Passing objects through Django template to javascript

本文关键字:javascript 对象 Django 通过      更新时间:2023-09-26

我正在使用Django制作一个网站,我想通过Django模板和Dajax调用从我的视图(在那里创建)传递一个python对象。问题是,当它到达dajax时,它已被转换为unicode类型。

In my Template

<script>
var emailer = "{{emailer|safe}}"; <---If I omit the quotes here then I get a javascript error.
sessionStorage.setItem('emailer',emailer);
$(document).ready(function(){
  $('.send').on('click', function(e){  
    var emailer = sessionStorage.getItem('emailer');
    Dajaxice.InterfaceApp.sendEmail(submitverify,{'emailer':emailer});
  });
});
</script>

dajax函数

@dajaxice_register(method='GET')
def sendEmail(emailer):
    logger.warning("type: %s, %s" % (type(emailer),emailer))
    email_body = "message"
    emailer.addToMessage(email_body)
    emailer.send()
    message = "Email Sent"
return json.dumps({'message':message})

logger语句返回:type: <type 'unicode'>, <Utils.SIMPL_Emailer instance at 0x103142ab8>。有没有办法解决这个问题,让我得到我的电子邮件对象,而不是unicode字符串?

首先试着理解发生了什么:

在你的模板中,你试图将一个Python对象保存到Javascript var:

var emailer = "{{emailer|safe}}";`

但这是不可能的。当你的模板被Django渲染时,你真正得到的是object __str__()方法的调用,你的Javascript将存储<Utils。SIMPL_Emailer实例0x103142ab8>值的emailer变量。记住:此代码在客户端浏览器中运行。这就是为什么当你删除引号时你会得到一个错误。

要解决这个问题,你需要首先序列化你的emailer对象(例如,将其转换为可以表示为字符串的东西,然后再转换回Python对象)。但正如Peter DeGlopper所指出的那样,这是一种非常不安全的方法。永远不要反序列化可公开访问的整个对象。相反,只将电子邮件数据发送到模板。您可以使用这些数据创建一个字典,将其转换为JSON(这也是序列化,但这次您只序列化数据),然后将其传递给模板。

所以不要把你的电子邮件放在模板上下文中。相反,创建一个字典并将其传递给模板。

然后在Python sendEmail(emailer)方法中,你需要实例化一个新的emailer对象并为其提供数据,如:

@dajaxice_register(method='GET')
def sendEmail(email_json):
    email = json.loads(email_json) # email_json is a json with your email data only
    logger.warning("type: %s, %s" % (type(email_json),email_json))
    emailer = Emailer("<with all your params...>")
    emailer.addToMessage(email.get('body'))
    emailer.send()
    message = "Email Sent"
    return json.dumps({'message':message})