让Django与Angular路由一起玩得很好

时间:2015-10-03 17:19:42

标签: javascript python angularjs django

我有一个现有的Django项目,我正在添加一个新的应用程序,它包含一个API(使用rest-framework)和一个角度应用程序。这个应用程序包含一个Django模板,它只是作为Angular挂钩的一种方式,然后使用它自己的部分:

{% extends "base.html" %}
{% block content %}

<div ui-view></div>

{% endblock %}

从这里开始,我想让angular接管应用程序的路由:

$resourceProvider.defaults.stripTrailingSlashes = false;

// Routing
$locationProvider.html5Mode({
  enabled: true,
  requireBase: false
});

$stateProvider
    .state('list', {
        url: '/routines',
        templateUrl: 'static/partials/routine/routine_list.html',
        controller: 'RoutineListController',
    })
    .state('add', {
        url: '/routines/add',
        templateUrl: 'static/partials/routine/routine_add_edit.html',
        controller: 'RoutineAddController',
    });

$urlRouterProvider.otherwise('/routines');

这适用于应用加载的第一页,但尝试导航到任何后续页面会导致Django显示404错误消息

Page not found (404)
Request Method: GET
Request URL:    http://127.0.0.1:8000/routines/add

基于我对这两个系统的当前(有限)知识,我试图在我的Django配置中指定一个url,该url将应用于所有例程/ * url并且不加载模板,允许angular请求它所需的部分,以便它可以继续不间断地运行SPA。但是,我无法找到有关指定没有模板的URL的任何信息,这让我相信这不是正确的解决方案。

urlpatterns = [

url(r'^$', views.routineView, name='routine'),

url(r'^/.*$', views.routineView, name='angular'),

要点: 我想使用Angular和Django rest API应用程序来创建Web应用程序。但是,我想保留现有的Django网站的其余部分,并简单地添加它(我当前的Django base.html模板中的嵌入式SPA)。如何设置路由(在Angular和Django上),以便Django允许Angular在请求某个页面后运行中断(在本例中为site.com/routines)。

1 个答案:

答案 0 :(得分:0)

据我所知,你只想在某些路线上使用带有Django Rest API的AngularJS和Django模板。我在使用这个https://github.com/mgonto/restangular之前做了这个。您只需创建代表资源的服务即可。以下是AngularJS中服务的示例代码:

(function() {
    function Course(Restangular) {
        var service = Restangular.all("course");
        //studentStats refers to the corresponding JS function that will call the API (note API URL is configured in app.js)
        //student_stats refers to the corresponding url in Django API
        service.addRestangularMethod("studentStats", "get", "student_statuses");
        return service;
    }
    angular.module("YOUR-APP")
    .service("Course", ["Restangular", Course]);
}).call(null);