【问题标题】:Django variable isnt recognized by javascriptjavascript 无法识别 Django 变量
【发布时间】:2013-08-13 03:47:39
【问题描述】:

我使用 django 的内置方法序列化了我的一个对象,然后将其传递到我的模板中。当我将 {{goals}} 放入 html 时,数据显示完美。但是,当我尝试通过 js 脚本访问它时,它不起作用。为什么是这样?我提醒了它,但它一直未定义。

#Python Views
def characterscreen(request):
    goals = serializers.serialize("json", Goal.objects.filter(userprofile=userprof)) 
    #goals = Goal.objects.filter(userprofile=userprof).values()
    return render_to_response('levelup/characterscreen.html', {'goals': goals}, context_instance=RequestContext(request))

Python 模型

class Goal(models.Model):
    title = models.CharField(max_length = 30)
    userprofile = models.ForeignKey(UserProfile)
    type = models.CharField(max_length = 5)

    def __unicode__(self):
        return str(self.title)

JS 文件

    $("body").onload =  load_goals();


function load_goals (){
     alert(goals);}

HTML

    <!DOCTYPE html>
    <html>
    <head>
        {% load staticfiles %}
        <title>{% block title %}{% endblock %}</title>
    <link rel="stylesheet" type="text/css" href="{% static 'levelup/style.css' %}" />
        {% block header %}{% endblock%}
    </head>
    <body>
        <div id="headercontainer">
            <div id="header">

            </div>
        </div>
        {% block content %}{% endblock %}   <script type="text/Javascript" src="http://code.jquery.com/jquery-1.10.1.min.js"></script>  <script type="text/Javascript" src="http://code.jquery.com/jquery-migrate-1.2.1.min.js"></script> 
<script type="text/javascript">goals = "{{ goals|safe }}"</script>
        <script type="text/Javascript" src="{% static 'levelup/script.js' %}"></script>
    </body>
    </html>

我尝试删除引号,现在当我执行警报(目标)时,变量只是提醒 [object Object],[object Object]

【问题讨论】:

  • 因为它在一个javascript文件中,它不再有{{goals}}的上下文。将此代码移动到您的模板中。
  • 你的 javascript 中还有:alert({{goals}});。从 javascript 中删除 {{}}:alert(goals);
  • 另外,您是否为您的目标模型定义了__str____unicode__ 方法?一旦定义了这样的方法,[object Object] 将被该方法的输出替换。
  • 我有警报(目标),我只是没有编辑上面的 js 脚本,但我现在做了以反映一切。

标签: javascript django json


【解决方案1】:

这是因为外部 .js 文件不像 html 文件那样被处理。这仅适用于内联脚本。所以你应该把它放在你的 HTML 文件中:

<script type="text/javascript">
    goals = "{{ goals }}"
</script>
<script type="text/javascript" src="script.js" />

然后你可以在 script.js 中使用目标变量。

编辑:
JSON 总是使用双引号,所以你必须在它周围加上单引号。此外,虽然 JSON 字符串在不带引号的情况下实际上代表一个真实的 Javascript 对象,但最好在使用 JSON 之前对其进行解析。由于您似乎正在使用 jQUery,请使用:

goals = $.parseJSON('{{ goals|safe }}')

【讨论】:

  • 非常感谢!它的输出很棒,但不幸的是,在 json 对象中的每个键和值周围都有“&”标记(因为我在 views.py 中将变量序列化为 JSON。)您是否碰巧知道这是为什么或如何解决它?
  • 默认情况下,不是 Django 的 SafeString SafeUnicodeSafeBytes 类的实例的每个变量都将被自动转义。您可以使用{% autoescape off %}{% endautoescape %} 来防止块被自动转义,但是对于单个变量,您需要使用safe 过滤器,这只会将单个变量标记为安全:{{ goals|safe }} .
  • 我试过了,警报返回 [object HTMLUListElement]。然后我尝试访问goals.pk,因为这是JSON 中的键之一,但警报返回未定义。那么,在 html 文件的脚本标记中将 javascript 变量“goals”设置为“{{ goal|safe }}”后,它是 JSON 对象吗?我很困惑为什么当我尝试访问目标变量的字段时它返回未定义。
  • 也许你需要去掉 {{ goals|safe }} 周围的引号。你能在你的html页面的源代码中发布什么吗?
  • @user1987920 实际意思是:当您在浏览器中转到“查看页面源代码”时会看到什么,或者{{ goals|safe }} 的输出是什么。无论如何,我用我认为应该可行的方法更新了我的答案,尽管我的 JSON 目前似乎有点生疏了。
猜你喜欢
  • 2017-01-04
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-27
  • 2013-05-15
  • 2017-03-27
相关资源
最近更新 更多