首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将对象从Django传递到Javascript DOM

将对象从Django传递到Javascript DOM
EN

Stack Overflow用户
提问于 2011-08-23 18:16:45
回答 14查看 72.1K关注 0票数 48

我试图用javascript将一个查询集从Django传递给一个模板。

我尝试过不同的方法来解决这个问题:

1.正常方法- Javascript由于命名>对象:ID <,>对象:ID <,. 而使解析对象的工作变得一团糟

Django视图

代码语言:javascript
运行
复制
django_list = list(Some_Object.objects.all())

模板HTML + JS

代码语言:javascript
运行
复制
<script type="text/javascript" >
    var js_list = {{django_list}};
</script>

2. JSON方法- Django在将对象列表转换为json字符串时失败,不是JSON序列化的

Django视图

代码语言:javascript
运行
复制
django_list = list(Some_Object.objects.all())
json_list = simplejson.dumps(django_list)

模板HTML + JS

代码语言:javascript
运行
复制
<script type="text/javascript" >
    var js_list = {{json_list}};
</script>

因此,我需要一些帮助:)

有人有什么建议/解决办法吗?

谢谢!

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2011-08-23 21:36:35

好吧,我找到解决办法了!

这主要是因为没有引用结果。当Javascript试图解析对象时,它不能被识别为字符串。

因此,第一步是:

代码语言:javascript
运行
复制
var js_list = {{django_list}}; 

改为:

代码语言:javascript
运行
复制
var js_list = "{{django_list}}";

之后,我意识到Django是在转义字符,所以我不得不这样替换它们:

代码语言:javascript
运行
复制
 var myJSONList = (("{{json_list}}").replace(/&(l|g|quo)t;/g, function(a,b){
                return {
                    l   : '<',
                    g   : '>',
                    quo : '"'
                }[b];
            }));

 myData = JSON.parse( myJSONList );

注意:我试图避免使用这个从Django转义字符

代码语言:javascript
运行
复制
var js_list = "{{json_list|safe}}"; 

但这不起作用,因为它会与引号混淆。

最后,在将JSON发送到Javascript之前,我找到了一种避免后端转换为JSON的逻辑的方法:

代码语言:javascript
运行
复制
var myDjangoList = (("{{django_list |safe}}").replace(/&(l|g|quo)t;/g, function(a,b){
            return {
                l   : '<',
                g   : '>',
                quo : '"'
            }[b];
        }));

myDjangoList = myDjangoList.replace(/u'/g, '\'')
myDjangoList = myDjangoList.replace(/'/g, '\"')

myData = JSON.parse( myDjangoList );

我相信这是可以改进的,我把这个交给你;)

谢谢你的回答

希望这对其他人有帮助!

票数 32
EN

Stack Overflow用户

发布于 2013-08-13 21:07:48

同样的问题,“更好”(最近)答案:json中使用的Django Queryset

瓦什什塔-乔吉的回答

更好的方法是使用DjangoJSONEncoder。它支持十进制。 从Price.objects.filter(product=product).values_list('price',django.core.serializers.json DjangoJSONEncoder valid_from= prices_json =json.dumps(列表(价格),cls=DjangoJSONEncoder)进口json 非常容易使用。不跳圈转换单个字段为浮动。 更新:将答案改为使用内置json而不是simplejson。

这是在我的谷歌搜索中经常出现的答案,并且有如此多的观点,所以更新它并避免其他人去挖掘它似乎是个好主意。假设是Django 1.5

票数 35
EN

Stack Overflow用户

发布于 2011-08-23 18:35:01

Django queryset 可序列化的JSON.有些字段类型(显然是日期)不能在is中序列化。日期对象的解决方案是在关于JSON和Python的另一个问题中发布的。

我建议直接在JavaScript中创建字典。给出这样的模型:

代码语言:javascript
运行
复制
class Article(models.Model):
    title = models.CharField(max_length=100)
    slug = models.SlugField()
    content = models.TextField()

class Author(models.Model):
    article = models.ForeignKey("Article", related_name="authors")
    first_name=models.CharField(max_length=100)
    last_name=models.CharField(max_length=100)

我会在模板中做这样的事情:

代码语言:javascript
运行
复制
<script type="text/javascript">
    var articles = [
    {% for article in article_list %}
        {% if not forloop.first %},{% endif %}
        {
            title: "{{ article.title }}",
            slug: "{{ article.slug }}",
            content: "{{ article.content }}",
            authors: [
            {% for author in article.authors.all %}
                {% if not forloop.first %},{% endif %}
                {
                    first_name: "{{ author.first_name }}",
                    last_name: "{{ author.last_name }}",
                }
            {% endfor %}
            ]
        }
    {% endfor %}
    ]
</script>

如果您可能把这个问题写得有点糟糕,而且不打算在<script>标记中插入代码,而且出于某种原因实际上需要JSON,那么我只需在视图中执行一个循环,创建一个dict列表,JSON在序列化中没有问题,JavaScript在理解上没有问题。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7165656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档