【问题标题】:pass queryset data to javascript as a variable template将查询集数据作为变量模板传递给 javascript
【发布时间】:2020-10-13 11:29:02
【问题描述】:

我正在尝试将查询集数据作为 javascript 变量传递给模板。我知道我正在做一些愚蠢但不起作用的事情。

views.py 

from django.http import HttpResponse
from django.template import Context,Template,RequestContext
from django.shortcuts import render_to_response, render
from django.conf.urls.static import static
from django.contrib import admin
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.template.context_processors import csrf
from io import TextIOWrapper
from django.core.mail import send_mail
from django.utils.safestring import mark_safe
from django.db import connection
import os
import json
import xlrd
from django import forms
from django.forms import ModelForm
from django.db import models
from .models import Deliveries
# Create your views here.

def historicals(request):
    context = {}          
    historicals= Deliveries.objects.all()[1:100]
    print (historicals)
    context['historicals']=historicals
    context['abc']=123
    return render(request,'customer.html',context)

然后

customer.html
{% extends "base.html" %}
{% load static %}
    <script type="text/javascript">
    //{% autoescape off %}{{ historicals }}{% endautoescape %}; <--tried this too
           var actuals = {{ historicals | safe }};
           var abc = {{ abc | safe }}   ;
        </script>
        <script src="{% static 'js/custom.js' %}"></script>
    {% block content %}         
            {% for i in actuals %}
                {{ i.Date }}
            {% endfor %}            
            <h1> {{ abc }} </h1> 
    {% endblock content %}

这就是混乱。

  1. 当我打印历史记录时,查询集显示在控制台中。它告诉我模型、与数据库和查询的连接正在工作。
  2. 我能够将值 'abc' =123 传递给模板,它会正确显示在 customer.html 中

我做错了什么让历史查询集甚至没有出现在模板中(我检查了视图源,它是空白的)但显示了简单的变量?

【问题讨论】:

  • 添加pythondjango标签
  • 刚刚添加的标签

标签: javascript python python-3.x django django-models


【解决方案1】:

您可以使用 Django 内置 serilizers 将数据传递给 js 用于查询集。

# views.py
from django.core import serializers

historicals = serializers.serialize("json", Deliveries.objects.all())

# html
<script type="text/javascript">
   // construct js objects
   var actuals = JSON.parse('{{ historicals | safe }}')
</script>

编辑

如果你想在django模板中循环,你只需要传递delivers查询集,不需要解析为js变量。

# views.py
diliveries = Deliveries.objects.all()

# html
{% for i in deliveries %}
  {{ i.Date }}
{% endfor %} 

【讨论】:

  • 谢谢! @minglyu。我可以在命令控制台中更好地看到 json 中的数据字典,但仍然根本看不到模板中的数据。
  • @user2162611模板需要python变量,actuals是javascripts对象,不能用于Django模板语言,如果要循环遍历变量,需要遵循js语法。
猜你喜欢
  • 2021-01-27
  • 1970-01-01
  • 1970-01-01
  • 2017-11-25
  • 1970-01-01
  • 2018-04-07
  • 2018-12-03
  • 2016-09-26
  • 1970-01-01
相关资源
最近更新 更多