【问题标题】:Django how do we send a model into javascript and render it onto a templateDjango我们如何将模型发送到javascript并将其渲染到模板上
【发布时间】:2022-01-01 20:06:33
【问题描述】:

我正在尝试使用 javascript 将 Django 模型传递到模板中。 一旦我让 javascript 读取它并将其传递给模板,我似乎无法过滤或使用 QuerySet 做任何事情。

我的意见.py:

def displayDict(request):
    m = ChatStream.objects.filter(name = visitor_ip_address(request))
    last = m.latest('name')
    return render(request, 'chatStream.html',
    {"chat": m, "last": last})

我的模型.py:

class ChatStream(models.Model):
    bot = models.TextField()
    user = models.TextField()
    name = models.CharField(max_length=100, null=True)
    created_date = models.DateTimeField(auto_now_add=True)

我的 chatStream.html 文件:

<p id="demo2">I will display when two seconds have passed.</p>

<script>
    var data = "{{chat}}";
    var lastEntry = "{{last}}"
    } 

setTimeout(myTimeout1, 2000) 


function myTimeout2() {
  document.getElementById("demo2").innerHTML = "2 seconds " + data + "lastEntry" + lastEntry;
}

</script>

我在 2 秒后得到的结果:

2 秒 , ]>lastEntryChatStream 对象 (31)

而不是显示“....]” 如何在名为 ChatStream 的模型中显示文本?...

我试过了:

<p id="demo2">I will display when two seconds have passed.</p>

<script>
    var data = "{{chat.user}}";
    var lastEntry = "{{last.user}}"
    } 

setTimeout(myTimeout1, 2000) 


function myTimeout2() {
  document.getElementById("demo2").innerHTML = "2 seconds " + data + "lastEntry" + lastEntry;
}

</script>

但上面没有显示任何内容。

我也试过

<p id="demo2">I will display when two seconds have passed.</p>

<script>
    var data = "{{chat | last }}";
    var lastEntry = "{{last}}"
    } 

setTimeout(myTimeout1, 2000) 


function myTimeout2() {
  document.getElementById("demo2").innerHTML = "2 seconds " + data + "lastEntry" + lastEntry;
}

</script>

但是最后过滤会抛出一个错误,我不能为负索引(并且我正在运行最新版本的 Django)。

非常感谢

【问题讨论】:

  • 如果你在这里发表你的看法,我可以给你一个答案。
  • 感谢@Hills -- 我添加了视图和模型
  • m 是对象的查询集,因此您需要遍历查询集以获取每个对象,然后在其中执行 chat.user 等。无论是在视图中还是在模板。如果您将此查询集传递给模板,您可以执行{% for my_query in my_queryset %} {{ my_query.user }} {% endfor %}
  • 感谢@Hills。我了解如何在 html 中渲染模型,但对我来说更具挑战性的是使用这个 javascript 函数,使用 setTimeout() 函数在 2 秒后显示信息
  • 您所追求的文本在您的对象查询集中的一个对象内。我不会将模板标签放在 js 脚本中。相反,您可以创建一个部分模板,然后使用 get 获取它,然后将响应添加到 html 中您想要的位置。

标签: javascript python html django


【解决方案1】:

ChatStream.objects.filter(...) 返回 QuerySet,它是 ChatStream 模型对象的列表,而不是 单个 ChatStream 模型对象。

如果要检索 ChatStream 模型的单个对象,请使用

m = ChatStream.objects.get(name=visitor_ip_address(request))

【讨论】:

  • 感谢@Sumithran:我正在尝试将模型作为变量传递给 javascript 函数,以便在模型对象被渲染之前有 2 秒的延迟。我该怎么做你在 javascript 中的建议?
  • 您的问题是如何正确显示文本,我建议您可以在模板中使用 var data = "{{chat}}"; var lastEntry = "{{last}}"; 来显示文本数据。
  • 好的,@Sumithran!一个问题,我在使用m = ChatStream.objects.get(name=visitor_ip_address(request)) 时遇到错误。错误是MultipleObjectsReturned get() returned more than one ChatStream -- it returned 3! .....我如何将条目隔离到最后一个条目?
  • 您有多个名称为Visitor_ip 的ChatStream 对象吗?可能导致此错误
  • 当您将数据插入聊天流对象时,请确保仅存在一个具有给定名称的聊天模型,这就是您解决此问题的方法。或者如果你想保留多个名称,你应该找到一个逻辑来选择一个实例。例如:选择一个名称等于当前用户或类似名称的 ChatStream obj,你明白了吗?
猜你喜欢
  • 1970-01-01
  • 2020-06-13
  • 1970-01-01
  • 1970-01-01
  • 2012-10-27
  • 2020-05-08
  • 1970-01-01
  • 1970-01-01
  • 2015-11-07
相关资源
最近更新 更多