[Django]-Folder Structure for Python Django-REST-framework and Angularjs

7πŸ‘

βœ…

If you are using two different domains. Here is a git seed for how I do it. Feel free to use it.

Angular/Django Seed

.
β”œβ”€β”€ app/
β”‚   β”œβ”€β”€ shared/   // acts as reusable components or partials of our site
β”‚   β”‚   β”œβ”€β”€ sidebar/
β”‚   β”‚   β”‚   β”œβ”€β”€ sidebarDirective.js
β”‚   β”‚   β”‚   └── sidebarView.html
β”‚   β”‚   └── article/
β”‚   β”‚       β”œβ”€β”€ articleDirective.js
β”‚   β”‚       └── articleView.html
β”‚   β”œβ”€β”€ components/   // each component is treated as a mini Angular app
β”‚   β”‚   β”œβ”€β”€ home/
β”‚   β”‚   β”‚   β”œβ”€β”€ homeController.js
β”‚   β”‚   β”‚   β”œβ”€β”€ homeService.js
β”‚   β”‚   β”‚   └── homeView.html
β”‚   β”‚   └── blog/
β”‚   β”‚       β”œβ”€β”€ blogController.js
β”‚   β”‚       β”œβ”€β”€ blogService.js
β”‚   β”‚       └── blogView.html
β”‚   β”œβ”€β”€ app.module.js
β”‚   └── app.routes.js
β”œβ”€β”€ assets/
β”‚   β”œβ”€β”€ img/      // Images and icons for your app
β”‚   β”œβ”€β”€ css/      // All styles and style related files (SCSS or LESS files)
β”‚   β”œβ”€β”€ js/       // JavaScript files written for your app that are not for angular
β”‚   └── libs/     // Third party libraries such as jQuery, Moment, Underscore, etc.
└── index.html
πŸ‘€Zack Argyle

16πŸ‘

Here’s how I approached this. Others have advocated completely decoupling your django and angularjs applications but this might work for you.

You have two apps, Account App and Other App. You want to create modular angular applications in both that can be β€œplugged” into another django project (with minimal modifications).

Account App static file structure:

β”‚Β Β  β”œβ”€β”€ static
β”‚Β Β  β”‚Β Β  └── app
β”‚Β Β  β”‚Β Β      └── js
β”‚Β Β  β”‚Β Β          β”œβ”€β”€ apps
β”‚Β Β  β”‚Β Β          β”‚Β Β  └── accountApp.js
β”‚Β Β  β”‚Β Β          β”œβ”€β”€ controllers
β”‚Β Β  β”‚Β Β          β”‚Β Β  └── accountControllers.js
β”‚Β Β  β”‚Β Β          β”œβ”€β”€ directives
β”‚Β Β  β”‚Β Β          β”‚Β Β  └── accountDirectives.js
β”‚Β Β  β”‚Β Β          β”œβ”€β”€ filters
β”‚Β Β  β”‚Β Β          β”‚Β Β  └── accountFilters.js
β”‚Β Β  β”‚Β Β          └── services
β”‚Β Β  β”‚Β Β              └── accountServices.js

Other App static file structure:

β”‚Β Β  β”œβ”€β”€ static
β”‚Β Β  β”‚Β Β  └── app
β”‚Β Β  β”‚Β Β      └── js
β”‚Β Β  β”‚Β Β          β”œβ”€β”€ apps
β”‚Β Β  β”‚Β Β          β”‚Β Β  └── otherApp.js
β”‚Β Β  β”‚Β Β          β”œβ”€β”€ controllers
β”‚Β Β  β”‚Β Β          β”‚Β Β  └── otherControllers.js
β”‚Β Β  β”‚Β Β          β”œβ”€β”€ directives
β”‚Β Β  β”‚Β Β          β”‚Β Β  └── otherDirectives.js
β”‚Β Β  β”‚Β Β          β”œβ”€β”€ filters
β”‚Β Β  β”‚Β Β          β”‚Β Β  └── otherFilters.js
β”‚Β Β  β”‚Β Β          └── services
β”‚Β Β  β”‚Β Β              └── otherServices.js

App Base file structure:

β”‚Β Β  β”œβ”€β”€ static
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ app
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ js
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ app.js
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ controllers.js
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ directives.js
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ filters.js
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  └── services.js

Main project static file folder (after running manage.py collectstatic):

β”‚Β Β  β”œβ”€β”€ static
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ app
β”‚Β Β  β”‚Β Β   Β Β  β”œβ”€β”€ js
β”‚Β Β  β”‚Β Β   Β Β   Β Β  β”œβ”€β”€ app.js
β”‚Β Β  β”‚Β Β   Β Β   Β Β  β”œβ”€β”€ controllers.js
β”‚Β Β  β”‚Β Β   Β Β   Β Β  β”œβ”€β”€ directives.js
β”‚Β Β  β”‚Β Β   Β Β   Β Β  β”œβ”€β”€ filters.js
β”‚Β Β  β”‚Β Β   Β Β   Β Β  β”œβ”€β”€ services.js
β”‚Β Β  β”‚Β Β   Β Β   Β Β  β”œβ”€β”€ apps
β”‚Β Β  β”‚Β Β          β”‚Β Β  └── accountApp.js
β”‚Β Β  β”‚Β Β          β”‚Β Β  └── otherApp.js
β”‚Β Β  β”‚Β Β          β”œβ”€β”€ controllers
β”‚Β Β  β”‚Β Β          β”‚Β Β  └── accountControllers.js
β”‚Β Β  β”‚Β Β          β”‚Β Β  └── otherControllers.js
β”‚Β Β  β”‚Β Β          β”œβ”€β”€ directives
β”‚Β Β  β”‚Β Β          β”‚Β Β  └── accountDirectives.js
β”‚Β Β  β”‚Β Β          β”‚Β Β  └── otherDirectives.js
β”‚Β Β  β”‚Β Β          β”œβ”€β”€ filters
β”‚Β Β  β”‚Β Β          β”‚Β Β  └── accountFilters.js
β”‚Β Β  β”‚Β Β          β”‚Β Β  └── otherFilters.js
β”‚Β Β  β”‚Β Β          └── services
β”‚Β Β  β”‚Β Β              └── accountServices.js
β”‚Β Β  β”‚Β Β              └── otherServices.js

Instead of using just regular AngularJS templates, use Django-powered AngularJS templates so you can pass cool stuff when rendering angular templates, like django-crispy-forms or render entire app views with django then only modify them with angular.

Partials Django-controllers directory inside any angular app (eg Account App or Other App):

β”‚Β Β  β”œβ”€β”€ partials
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ urls.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ views.py

urls.py

urlpatterns = patterns('users.partials.views',
    url(r'^list/$', UserPartialListView.as_view(), name="list"),
    url(r'^detail/$', UserPartialDetailView.as_view(), name="detail"),
    )

views.py

# can pass any global context or methods here
from app_base.views import PartialView

# pass app global context or methods here
class UserPartialView(PartialView):
    template_name = "users/partials/base.html"

# view specific context or methods here
class UserPartialListView(UserPartialView):
    template_name = "users/partials/list.html"

# view specific context or methods here
class UserPartialDetailView(UserPartialView):
    template_name = "users/partials/detail.html"

Partials Templates directory inside any angular app (eg Account App or Other App):

β”‚Β Β  β”œβ”€β”€ templates
β”‚Β Β  β”‚Β Β  └── accounts
β”‚Β Β  β”‚Β Β      └── partials
β”‚Β Β  β”‚Β Β          β”œβ”€β”€ base.html
β”‚Β Β  β”‚Β Β          β”œβ”€β”€ detail.html
β”‚Β Β  β”‚Β Β          └── list.html

Main Partials Django-router:

# myapp.partials.urls

urlpatterns = patterns('',
    url(r'^accounts/', include('accounts.partials.urls', namespace="accounts_partials")),
    url(r'^others/', include('others.partials.urls', namespace="others_partials")),
    )

Full Example Directory Structure:

β”œβ”€β”€ accounts
β”‚Β Β  β”œβ”€β”€ __init__.py
β”‚Β Β  β”œβ”€β”€ forms.py
β”‚Β Β  β”œβ”€β”€ management
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
β”‚Β Β  β”‚Β Β  └── commands
β”‚Β Β  β”‚Β Β      β”œβ”€β”€ __init__.py
β”‚Β Β  β”‚Β Β      β”œβ”€β”€ importbusinesses.py
β”‚Β Β  β”œβ”€β”€ models.py
β”‚Β Β  β”œβ”€β”€ partials
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ urls.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ views.py
β”‚Β Β  β”œβ”€β”€ permissions.py
β”‚Β Β  β”œβ”€β”€ serializers.py
β”‚Β Β  β”œβ”€β”€ static
β”‚Β Β  β”‚Β Β  └── app
β”‚Β Β  β”‚Β Β      └── js
β”‚Β Β  β”‚Β Β          β”œβ”€β”€ apps
β”‚Β Β  β”‚Β Β          β”‚Β Β  └── accountApp.js
β”‚Β Β  β”‚Β Β          β”œβ”€β”€ controllers
β”‚Β Β  β”‚Β Β          β”‚Β Β  └── accountControllers.js
β”‚Β Β  β”‚Β Β          β”œβ”€β”€ directives
β”‚Β Β  β”‚Β Β          β”‚Β Β  └── accountDirectives.js
β”‚Β Β  β”‚Β Β          β”œβ”€β”€ filters
β”‚Β Β  β”‚Β Β          β”‚Β Β  └── accountFilters.js
β”‚Β Β  β”‚Β Β          └── services
β”‚Β Β  β”‚Β Β              └── accountServices.js
β”‚Β Β  β”œβ”€β”€ templates
β”‚Β Β  β”‚Β Β  └── accounts
β”‚Β Β  β”‚Β Β      └── partials
β”‚Β Β  β”‚Β Β          β”œβ”€β”€ base.html
β”‚Β Β  β”‚Β Β          β”œβ”€β”€ detail.html
β”‚Β Β  β”‚Β Β          └── list.html
β”‚Β Β  β”œβ”€β”€ urls.py
β”‚Β Β  β”œβ”€β”€ views.py
β”œβ”€β”€ api_root
β”‚Β Β  β”œβ”€β”€ __init__.py
β”‚Β Β  β”œβ”€β”€ admin.py
β”‚Β Β  β”œβ”€β”€ models.py
β”‚Β Β  β”œβ”€β”€ tests.py
β”‚Β Β  β”œβ”€β”€ urls.py
β”‚Β Β  └── views.py
β”œβ”€β”€ app_base
β”‚Β Β  β”œβ”€β”€ __init__.py
β”‚Β Β  β”œβ”€β”€ __init__.pyc
β”‚Β Β  β”œβ”€β”€ forms.py
β”‚Β Β  β”œβ”€β”€ models.py
β”‚Β Β  β”œβ”€β”€ models.pyc
β”‚Β Β  β”œβ”€β”€ static
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ LICENSE
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ README.md
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ app
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ css
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  └── app.css
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ img
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ js
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ app.js
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ apps
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  └── accountApp.js
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ controllers
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ controllers.js
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ directives
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ directives.js
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ filters
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ filters.js
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ services
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  └── services.js
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ lib
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β  └── angular
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ angular-animate.js
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ angular-animate.min.js
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ angular-animate.min.js.map
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ angular-cookies.js
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ angular-cookies.min.js
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ angular-cookies.min.js.map
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ angular-csp.css
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ angular-loader.js
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ angular-loader.min.js
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ angular-loader.min.js.map
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ angular-resource.js
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ angular-resource.min.js
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ angular-resource.min.js.map
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ angular-route.js
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ angular-route.min.js
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ angular-route.min.js.map
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ angular-sanitize.js
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ angular-sanitize.min.js
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ angular-sanitize.min.js.map
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ angular-scenario.js
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ angular-touch.js
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ angular-touch.min.js
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ angular-touch.min.js.map
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ angular.js
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ angular.min.js
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ angular.min.js.gzip
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ angular.min.js.map
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ errors.json
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ i18n
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      β”‚Β Β  β”œβ”€β”€ ...
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ version.json
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”‚Β Β      └── version.txt
β”‚Β Β  β”‚Β Β  β”‚Β Β  └── partials
β”‚Β Β  β”‚Β Β  β”‚Β Β      β”œβ”€β”€ partial1.html
β”‚Β Β  β”‚Β Β  β”‚Β Β      └── partial2.html
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ config
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ karma.conf.js
β”‚Β Β  β”‚Β Β  β”‚Β Β  └── protractor-conf.js
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ logs
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ package.json
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ scripts
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ e2e-test.bat
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ e2e-test.sh
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ test-all.sh
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ test.bat
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ test.sh
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ update-angular.sh
β”‚Β Β  β”‚Β Β  β”‚Β Β  β”œβ”€β”€ watchr.rb
β”‚Β Β  β”‚Β Β  β”‚Β Β  └── web-server.js
β”‚Β Β  β”‚Β Β  └── test
β”‚Β Β  β”‚Β Β      β”œβ”€β”€ e2e
β”‚Β Β  β”‚Β Β      β”‚Β Β  └── scenarios.js
β”‚Β Β  β”‚Β Β      β”œβ”€β”€ lib
β”‚Β Β  β”‚Β Β      β”‚Β Β  └── angular
β”‚Β Β  β”‚Β Β      β”‚Β Β      β”œβ”€β”€ angular-mocks.js
β”‚Β Β  β”‚Β Β      β”‚Β Β      └── version.txt
β”‚Β Β  β”‚Β Β      └── unit
β”‚Β Β  β”‚Β Β          β”œβ”€β”€ controllersSpec.js
β”‚Β Β  β”‚Β Β          β”œβ”€β”€ directivesSpec.js
β”‚Β Β  β”‚Β Β          β”œβ”€β”€ filtersSpec.js
β”‚Β Β  β”‚Β Β          └── servicesSpec.js
β”‚Β Β  β”œβ”€β”€ templates
β”‚Β Β  β”‚Β Β  └── app_base
β”‚Β Β  β”‚Β Β      β”œβ”€β”€ base.html
β”‚Β Β  β”‚Β Β      └── index.html
β”‚Β Β  β”œβ”€β”€ urls.py
β”‚Β Β  β”œβ”€β”€ views.py
πŸ‘€Will Farley

Leave a comment