我正在使用 Django 制作一个网站,我想通过 Django 模板从我的 View (创建它的地方)传递一个 python 对象并传递给 Dajax 调用。问题是,当它到达 dajax 时,它已经变成了 unicode 类型。
在我的模板中
<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})
此处记录器语句返回:type: <type 'unicode'>, <Utils.SIMPL_Emailer instance at 0x103142ab8>
.有什么方法可以解决此问题,以便我获得电子邮件对象而不是 unicode 字符串?
最佳答案
首先尝试了解正在发生的事情:
在您的模板上,您试图将 Python 对象保存到 Javascript var:
var emailer = "{{emailer|safe}}";`
但这是不可能的。当您的模板由 Django 呈现时,您真正得到的是对对象 __str__() 方法的调用,并且您的 Javascript 会将
要解决它,您需要首先序列化您的 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})
关于javascript - 通过 Django 模板将对象传递给 javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32640029/