在将backbone.js和django与Django-restframework一起使用时,我对路由和url设置非常困惑。
例如,我为我的一个网址定义了一个基于类的视图,我想使用backbone.js来更新显示学生的div
:
url(r'^home/students/$', views.StudentList.as_view()),
class StudentList(APIView):
"""
List all students
"""
def get(self, request, format=None):
students = Person.objects.filter(person_type = Person.STUDENT)
serializer = PersonSerializer(students)
return Response(serializer.data, "core/teachers/teacher_teaching.html")
def pre_save(self, obj):
obj.owner = self.request.user
Backbone路由如何适应django的url路由。我有一个文件router.js,类似这样:
function($,jqueryui, _, Backbone, HomeView, StudentsView) {
var AppRouter = Backbone.Router.extend({
routes: {
// Define some URL routes
':home': 'showStudents',
'users': 'showContributors',
// Default
'*actions': 'defaultAction'
}
});
var initialize = function(){
var app_router = new AppRouter;
app_router.on('route:showStudents', function(){
// Call render on the module we loaded in via the dependency array
var studentsView = new StudentsView();
studentsView.render();
});
然而这些路线从未真正得到我的观点?
答案 0 :(得分:6)
使用REST框架时模板适合哪些?
没有; Django模板适用于普通的Django HTML页面,而不适用于REST框架API。 REST框架API响应是以编程方式生成的文档(通常是JSON或XML),因此它们不需要模板。
Backbone路由如何适应django的URL路由
它们100%完全分开。假设你有一个像:
这样的网址www.example.com/foo/bar#baz
Django会处理这个URL:
www.example.com/foo/bar
而Backbone将处理其余的:
#baz
当然,这假设Django返回一个使用Backbone的网页;如果没有,#baz
将永远不会参与其中。
作为简要摘要,当您访问上述网址时,您的浏览器会向www.example.com/
询问/foo/bar
。这是你在Django的urls.py
进来的时候;它有:
url(r'^foo/bar/?$', views.FooBar.as_view()),
所以你的网络服务器知道发送回views.FooBar.as_view()
给它的任何内容(无论是REST框架生成的JSON文档还是旧式的Django HTML文档)。
一旦该文档返回到服务器,它就会呈现它,这就是Backbone及其路由器等客户端代码轮流使用的地方。 Backbone Router(无论何时调用Backbone.history.start()
)查看URL(即window.location
)并查找URL的锚点或“哈希”部分(例如#baz
)。然后,它会将URL的这一部分与其路由列表进行比较(类似于您的网络服务器将早期部分与urls.py进行比较),如果找到匹配,则会“将您发送到页面”。
这是理解的关键,它根本不会送你到任何地方;所有它真正做的是改变URL的哈希部分,然后运行一些操纵DOM的Javascript。因此,Backbone路由器不可能将您发送到Django URL;如果要访问服务器路由,则需要使用AJAX或window.location =
。