Javascript Django模板&x2B;基于SEO原因为相同内容制作Vue模板
我正在构建一个具有有限Javascript交互性的Django应用程序,并且正在研究如何将Vue模板与Django模板结合起来,用于相同的内容 想象一个无限滚动页面,其中SEO非常重要。Django非常擅长解决这个问题,因为根据定义,它是一个服务器端框架。但是,如果这两种技术都需要呈现相同的内容,那么如何使用Vue丰富Django呈现的页面?在这种情况下,Django将在Vue接管之前为SEO爬虫渲染,Vue将“水合物”这些组件并使它们具有交互性。在此之后,使用AJAX异步获取的后续内容也将使用Vue进行模板化 我做了一些研究,但没有找到足够的信息来解决这个问题:Javascript Django模板&x2B;基于SEO原因为相同内容制作Vue模板,javascript,python,django,vue.js,server-side-rendering,Javascript,Python,Django,Vue.js,Server Side Rendering,我正在构建一个具有有限Javascript交互性的Django应用程序,并且正在研究如何将Vue模板与Django模板结合起来,用于相同的内容 想象一个无限滚动页面,其中SEO非常重要。Django非常擅长解决这个问题,因为根据定义,它是一个服务器端框架。但是,如果这两种技术都需要呈现相同的内容,那么如何使用Vue丰富Django呈现的页面?在这种情况下,Django将在Vue接管之前为SEO爬虫渲染,Vue将“水合物”这些组件并使它们具有交互性。在此之后,使用AJAX异步获取的后续内容也将使用
- 下面代码示例的某些部分是基于
- 这说明django和vue的结合似乎非常好
分隔符
选项,我觉得可能有一种方法可以将两者结合起来(以避免模板语法的冲突)
{%load static%}
Django和Vue测试
{%if name%}
var names={{names_json | safe}};
Django列表
{名称中的名称为%}
-
{{name}}@test.se
{%endfor%}
Vue列表
-
[[name]]@test.se
var app=新的Vue({
分隔符:['[',']]'],
el:“#应用程序”,
数据:{
姓名:姓名,
},
方法:{
问候语:功能(名称){
console.log('Vue从'+name+'!'打招呼)
}
}
});
{%endif%}
我是不是想错了,或者你们有没有人能给我一些指导
非常感谢。我就是这样做的:
views.py
def show_客户(请求):
customers=Customer.objects.all()
上下文={
“客户”:客户,
}
返回呈现(请求“app/customers.html”,上下文)
模板:customers.html
客户名单
{%if DEBUG%}
{%else%}
{%endif%}
{客户中客户的百分比|切片:“:3”}
{{customer.id}-{{customer.user.username}
{%endfor%}
{%verbatim%}
{{customer.id}-{{customer.name}
{%endverbatim%}
展示更多的客户
Vue.组件(“客户”{
道具:{
顾客:反对,
下一页:字符串
},
模板:“#更多客户模板”
});
var customerMore=新的Vue({
el:'更多客户',
数据:{
顾客:[]
},
方法:{
loadMorecustomer:函数(){
this.customers=[{name:'Some dynamic data',id:1}]
}
}
});
此代码用于演示,您需要将JS代码和Vue模板代码分开
编辑:我发现了一篇关于这方面的非常好的文章,甚至更干净 我就是这样做的:
views.py
def show_客户(请求):
customers=Customer.objects.all()
上下文={
“客户”:客户,
}
返回呈现(请求“app/customers.html”,上下文)
模板:customers.html
客户名单
{%if DEBUG%}
{%else%}
{%endif%}
{客户中客户的百分比|切片:“:3”}
{{customer.id}-{{customer.user.username}
{%endfor%}
{%verbatim%}
{{customer.id}-{{customer.name}
{%endverbatim%}
展示更多的客户
Vue.组件(“客户”{
道具:{
顾客:反对,
下一页:字符串
},
模板:“#更多客户模板”
});
var customerMore=新的Vue({
el:'更多客户',
数据:{
顾客:[]
},
方法:{
loadMorecustomer:函数(){
this.customers=[{name:'Some dynamic data',id:1}]
}
}
});
此代码用于演示,您需要将JS代码和Vue模板代码分开
编辑:我发现了一篇关于这方面的非常好的文章,甚至更干净 您考虑过服务器端渲染吗?看看我有多少。问题是我对Django和
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<title>Django and Vue test</title>
</head>
<body>
{% if names %}
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script type="text/javascript">
var names = {{ names_json|safe }};
</script>
<div id="app">
<!-- This list is for SEO purposes, let's say 'above the fold' content contained in a responsive grid before an infinite scroll is triggered -->
<h2>Django list</h2>
<ul>
{% for name in names %}
<li>
<div>
<img src="avatar.jpg">
<div>
<div>{{ name }}@test.se</div>
</div>
</div>
</li>
{% endfor %}
</ul>
<!-- This list is supposed to somehow 'hydrate' the django template content, in order to enrich the template with interactive VueJS. When the client Vue instance is instantiated/mounted, the idea is that only these elements populate the page, and not the SSR ones -->
<h2>Vue list</h2>
<ul>
<li v-for="name in names">
<div v-on:click="greet(name)">
<img src="avatar.jpg">
<div>
<div>[[ name ]]@test.se</div>
</div>
</div>
</li>
</ul>
</div>
<script>
var app = new Vue({
delimiters: ['[[', ']]'],
el: '#app',
data: {
names: names,
},
methods: {
greet: function (name) {
console.log('Vue says hello from ' + name + '!')
}
}
});
</script>
{% endif %}
</body>
</html>