Django и Angular 2 templateUrl

#python #django #angular #django-rest-framework

#python #django #angular #django-rest-framework

Вопрос:

Я решил интегрировать существующее приложение Angular 2 в мой проект Django REST.

  1. создайте приложение Django со статической папкой для моего интерфейса:

    urls.py:

     from django.conf.urls import url
    from frontend import views
    from django.conf import settings
    from django.conf.urls.static import static
    
    
    urlpatterns = [
        url(r'^$', views.index,  name='index'),
    ]   static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
      

    views.py:

     from django.shortcuts import render
    
    def index(request):
        """
        Renders the Angular2 SPA
        """
        return render(request, template_name='index.html')
      
  2. переместите мое приложение Angular 2 в статическую папку интерфейса

  3. добавьте статические настройки в мои настройки:

     STATIC_URL = '/static/'
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'frontend', 'static'),
    ]
    
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')
      
  4. внесите изменения в index.html:

     <html>
      <head>
        <base href="/">
        <title>PhotoHub</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        {% load staticfiles %}
    
    
        <link rel="stylesheet" href="{% static "node_modules/bootstrap/dist/css/bootstrap.min.css" %}">
        <link href="{% static "bower_components/font-awesome/css/font-awesome.min.css" %}" rel="stylesheet" />
        <link href="{% static "bower_components/alertify.js/themes/alertify.core.css" %}" rel="stylesheet" />
        <link href="{% static "bower_components/alertify.js/themes/alertify.bootstrap.css" %}" rel="stylesheet" />
        <link rel="stylesheet" href="{% static "styles.css" %}">
    
        <script src="{% static "bower_components/jquery/dist/jquery.min.js" %}"></script>
        <script src="{% static "node_modules/bootstrap/dist/js/bootstrap.min.js" %}"></script>
        <script src="{% static "bower_components/alertify.js/lib/alertify.min.js" %}"></script>
        <!-- 1. Load libraries -->
         <!-- Polyfill(s) for older browsers -->
        <script src="{% static "node_modules/core-js/client/shim.min.js" %}"></script>
        <script src="{% static "node_modules/zone.js/dist/zone.js" %}"></script>
        <script src="{% static "node_modules/reflect-metadata/Reflect.js" %}"></script>
        <script src="{% static "node_modules/systemjs/dist/system.src.js" %}"></script>
        <!-- 2. Configure SystemJS -->
        <script src="{% static "systemjs.config.js" %}"></script>
        <script>
          System.import('app').catch(function(err){ console.error(err); });
        </script>
      </head>
      <!-- 3. Display the application -->
      <body>
        <photohub></photohub>
      </body>
    </html>
      
  5. внесите изменения в systemjs.config.js :

     (function (global) {
      System.config({
        //static
        defaultJSExtensions: true,
        paths: {
          // paths serve as alias
          'npm:': 'static/node_modules/'
        },
        // map tells the System loader where to look for things
        map: {
          app: 'static/dist',
          // angular bundles
          '@angular/core': 'npm:@angular/core/bundles/core.umd.js',
          '@angular/common': 'npm:@angular/common/bundles/common.umd.js',
          '@angular/compiler': 'npm:@angular/compiler/bundles/compiler.umd.js',
          '@angular/platform-browser': 'npm:@angular/platform-browser/bundles/platform-browser.umd.js',
          '@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js',
          '@angular/http': 'npm:@angular/http/bundles/http.umd.js',
          '@angular/router': 'npm:@angular/router/bundles/router.umd.js',
          '@angular/forms': 'npm:@angular/forms/bundles/forms.umd.js',
          // other libraries
          'rxjs':                      'npm:rxjs',
          'angular-in-memory-web-api': 'npm:angular-in-memory-web-api',
        },
        // packages tells the System loader how to load when no filename and/or no extension
        packages: {
          app: {
            main: './main.js',
            defaultExtension: 'js'
          },
          rxjs: {
            defaultExtension: 'js'
          },
          'angular-in-memory-web-api': {
            main: './index.js',
            defaultExtension: 'js'
          }
        }
      });
    })(this);
      

Файлы TypeScript скомпилированы в /dist , а шаблоны остались в /app . Когда я использовал два разных сервера, путь к templateUrl выглядел так:

 templateUrl: './app/app.component.html'
  

теперь я пытаюсь объявить templateUrl таким образом, но это не работает:

 templateUrl: '{{ STATIC_URL }}'   '/app/app.component.html'
  

Как теперь работать с URL-адресами шаблонов?

Ответ:

«ПОЛУЧИТЬ /app/components/login/login.component.html HTTP/1.1″404 2601
Не найден: /app/app.component.html

Файлы JavaScript загружаются хорошо:

«ПОЛУЧИТЬ /app/components/login/login.component.html HTTP/1.1″404 2601
Не найден: /app/components/register/register.component.html

Комментарии:

1. Это много полезной информации, которую затем можно использовать с помощью «не работает» .

Ответ №1:

Это решаемая проблема:

 templateUrl: 'static/app/app.component.html'
  

Ответ №2:

Я не уверен, с какой ошибкой вы столкнулись, но вам, вероятно, следует использовать static тег для создания URL-адреса статического ресурса в вашем шаблоне:

 {% load static %}

templateUrl: "{% static '/app/app.component.html' %}"
  

Документ:https://docs.djangoproject.com/en/1.10/ref/templates/builtins/#std:templatetag-static