Django - 如何渲染 html 并同时返回一个 json

Posted

技术标签:

【中文标题】Django - 如何渲染 html 并同时返回一个 json【英文标题】:Django - How to render html and return a json at the same time 【发布时间】:2019-05-13 14:17:52 【问题描述】:

我有一个填充 json 对象的视图,然后,在同一视图的末尾,我将呈现一个 html 页面,但也返回最终的 json。

可能这无关紧要,但 json 可能是这样的:


    "embedToken": "dasfgjasdàgjasdàgasdàgèe-AveryLongToken",
    "embedUrl": "https://app.powerbi.com/let's_go_to_the_lake",
    "reportId": "e615-sfash-9746"

我无法修复的行(用所有替代方法尝试了一整天)如下:

return render(request, "home.html", jsn)

我的 url.py 简单如下:

urlpatterns = [
    path('', HomePageView, name='home'),
]

我目前收到以下错误:

context must be a dict rather than str.

但是我在途中遇到了各种不同类型的错误,但没有成功达到预期的结果(渲染 html 并同时返回 json)。所以我怀疑我在基础上采取了错误的方法,我应该改变道路吗?

我想尝试将 json 转换为字典,然后在 javascript 中将其转换回 json

我还尝试拆分我的请求,将 html 呈现为 django 视图,并从 javascript ajax 请求执行函数调用,如下所示:

function handler1()
    // there are many other methods like $.get $.getJSON
    $.ajax(
       type: 'GET',
       dataType: 'json',
       url: "http://piedpiper.com/api/callers"
    ).then(function(result) 
        // do something with the result

    );

但我最终明白,通过这种方式,我必须创建 URL api/callers,每个人都可以使用/可访问,但由于用户会话,我无法做到这一点。只有登录的用户才能看到 json 数据

【问题讨论】:

这是 http 请求的原生特性。一个请求,一个响应。不是两个回应。你应该改变你的逻辑。一个请求 html,另一个请求 json。 请看我的更新,你觉得怎么样? 您能否提供更多有关您的需求的详细信息?您不能期望从一个视图中得到两个响应。每个视图都可以返回一个 HTML 页面或 JSON 响应。我认为最好在第一个视图中返回一个 HTML 页面,然后在该 HTML 中调用 ajax 从另一个视图获取 json 值。 【参考方案1】:

您需要在渲染时添加正确的参数。 Here is the docs for render function in Django

这是一个视图的示例代码

def post_detail(request, slug=None):
    instance = get_object_or_404(Post, slug=slug)
    share_string = quote_plus(instance.content)
    context = 
        "title": instance.title,
        "instance": instance,
        "share_string": share_string,
    
    return render(request, "post_detail.html", context)

【讨论】:

以上是关于Django - 如何渲染 html 并同时返回一个 json的主要内容,如果未能解决你的问题,请参考以下文章

Django之模板渲染

如何在视图 Django 中更改渲染以返回 json [重复]

Visual Studio Code:如何删除 html 标签并同时写入多行?

Django---Django返回用户输入数据

Django循环进入模板,ORM

Django框架模版渲染与过滤器使用