通过Django模板将对象传递到javascrip

2024-05-28 20:40:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Django创建一个网站,我希望通过Django模板将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函数

^{pr2}$

这里logger语句返回:type: <type 'unicode'>, <Utils.SIMPL_Emailer instance at 0x103142ab8>。有没有办法解决这个问题,这样我就可以得到emailer对象而不是unicode字符串?在


Tags: 对象django视图模板类型网站vartype
1条回答
网友
1楼 · 发布于 2024-05-28 20:40:58

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

在模板中,您试图将Python对象保存到Javascript变量:

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

但这是不可能的。当您的模板由Django呈现时,您真正得到的是一个对object\uu str_uu()方法的调用,您的Javascript将存储<;Utils.SIMPL_电子邮件实例为0x103142ab8>;值,并记住:此代码在客户端浏览器中运行。这就是为什么删除引号时会出现错误。在

要解决这个问题,首先需要序列化emailer对象(例如,将其转换为可以表示为字符串的对象,然后再返回Python对象)。但正如彼得·德格洛珀指出的那样,这是一种非常不安全的做法。永远不要反序列化可供公共访问的整个对象。而是只将电子邮件数据发送到模板。您可以用这些数据创建一个字典,将其转换为JSON(这也是一个序列化,但这次只序列化数据),然后将其传递给模板。在

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

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

^{pr2}$

相关问题 更多 >

    热门问题