模板未在 Django 提供的 Vue 中呈现 [重复]

Posted

技术标签:

【中文标题】模板未在 Django 提供的 Vue 中呈现 [重复]【英文标题】:Template not rendered in Vue served by Django [duplicate] 【发布时间】:2019-01-06 01:44:35 【问题描述】:

我有一个用于后端的 Django 应用程序,它以 Vue 作为前端来呈现模板。我在 django 中的视图代码有以下部分:

# thing/views.py
def index(request):
    template = loader.get_template('thing/index.html')
    return HttpResponse(template.render(, request))

# thing/urls.py
from django.views.generic import TemplateView

urlpatterns = [
    path('', TemplateView.as_view(template_name='index.html')),
]

# some other files that complete the project are not included

index.html中有如下代码:

<div id="app">
    <p v-if="quotaRemaining > -1">
        Remaining:  quotaRemaining 
    </p>
</div>

<script>
    const app = new Vue(
        el: '#app',
        data: 
            quotaRemaining: 42,
        ,
    );
</script>

当我访问此页面时,唯一呈现的是:

剩余:

虽然我希望它是

剩余:42

为什么我的 Vue 模板在由 Django 提供服务时无法正确呈现?如何让它发挥作用?

【问题讨论】:

【参考方案1】:

Django 有自己的template language,它有一个variables 的概念。它将 quotaRemaining 视为一个 Django 变量,甚至在它到达前端(到 Vue)之前就对其进行处理。至少有两种解决方案。

    带有% verbatim %标签的环绕Vue相关代码:

    停止模板引擎渲染这个块标签的内容。一个常见的用途是允许与 Django 的语法发生冲突的 javascript 模板层。

    % verbatim %
    <p v-if="quotaRemaining > -1">
        Remaining:  quotaRemaining 
    </p>
    % endverbatim %
    

    自定义 Vue delimiters 并在您的客户端代码中使用这些分隔符:

    <!-- template code -->
    <p v-if="quotaRemaining > -1">
        Remaining: $ quotaRemaining 
    </p>
    
    // js code
    const app = new Vue(
        el: '#app',
        delimiters: ['$', ''],
        data: 
            quotaRemaining: 42,
        ,
    );
    

【讨论】:

偶尔也可以使用 quotaRemaining ... @JonClements,不错,但没有编译:Could not parse the remainder: ' quotaRemaining' from ' quotaRemaining' 哦,是的...那么请忽略我...不知道我在想什么模板语言,或者我是否只是以某种方式梦想出来:)

以上是关于模板未在 Django 提供的 Vue 中呈现 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

重定向后表单未在模板中呈现(django)

Django外键未在模板中呈现相关模型数据

Vue 模板未在 for 循环中呈现

Django 联系电子邮件表单未在模板 home.html 中呈现/显示

models.TextField() 中的换行符未在模板中呈现

vue composition api中的反应性数据未在模板中呈现