In this tutorial I will demonstrate how to create a Django + React website using Django 2.0. You must have Eclipse installed before you continue. If you have it already installed and configured you can continue on. We will require Postgres 9.4, nodejs before you continue. You can get Nodejs from here. You can get Postgres 9.4 from here.
Pip Django Install:
pip install django pip install django-webpack-loader
Django Version:
If you are not sure what version you are running do the following
python -c "import django; print(django.get_version())"
Eclipse Create Project:
Eclipse Setup Project:
Eclipse Django DB Settings:
Eclipse Django Setup Successful:
Once you click “Finish” your project will look like the following.
Folder Structure:
- Under djangoApp project.
- folder: static
- folder: djangoApp
- folder: templates
- file: index.html
- folder: base
- file: base.html
- folder: templates
- folder: assets
- folder: bundles
- folder: js
- file: index.jsx
Node:
Inside the djangoApp application do the following
npm init npm install --save-dev jquery react react-dom webpack webpack-bundle-tracker babel-loader babel-core babel-preset-es2015 babel-preset-react npm install create-react-class --save
webpack.config.js:
var path = require('path') var webpack = require('webpack') var BundleTracker = require('webpack-bundle-tracker') module.exports = { //the base directory (absolute path) for resolving the entry option context: __dirname, //the entry point we created earlier. Note that './' means //your current directory. entry: { "index": [path.resolve(__dirname, "./assets/js/index.jsx")], }, output: { path: path.resolve('./assets/bundles/'), filename: "[name]-[hash].js", }, plugins: [ //tells webpack where to store data about your bundles. new BundleTracker({filename: './webpack-stats.json'}), //makes jQuery available in every module new webpack.ProvidePlugin({ $: 'jquery', jQuery: 'jquery', 'window.jQuery': 'jquery' }) ], module: { loaders: [ { test: /\.jsx?$/, exclude: /(node_modules)/, loader: 'babel-loader', query: { presets: ['react','es2015'] } } ] } }
djangoApp\Settings.py:
Installed Apps
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'webpack_loader',
]
Add/Edit the following template directive
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'djangoApp', 'templates'),],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},]
Add the following static directive
STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'assets'), ]
Modify DATABASES
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'YOUR_DB_NAME',
'USER': 'YOUR_USER',
'PASSWORD': 'YOUR_PASSWORD',
'HOST': 'localhost',
'PORT': 5432
}
}
Webpack Loader
WEBPACK_LOADER = { 'DEFAULT': { 'BUNDLE_DIR_NAME': 'bundles/', 'STATS_FILE': os.path.join(BASE_DIR, 'webpack-stats.json'), } }
djangoApp\views.py:
We will create our index page view. Notice the third dict. Those are variables passed to the template to make our site dynamic
from django.shortcuts import render def index(request): return render(request, 'index.html', {'title': 'Index Page', 'script_name': 'index'})
djangoApp\urls.py:
Add the following imports
from django.conf.urls import url
#This is the index view we created above
from djangoApp.views import index
urlpatterns = [
url(r'^$', index, name='index'),
path('admin/', admin.site.urls),
]
djangoApp\templates\base\base.html:
Let’s setup our base template and setup our blocks that the other templates will inherit from.
<html> <head> <title>{% block title %}{% endblock %}</title> </head> <body> {% block content %} {% endblock %} </body> </html>
djangoApp\templates\index.html:
The important parts here are the extends otherwise your base.html template won’t be inherited. As well the {% with %} and title variable makes our template dynamic and allows us to incorporate react in our site.
{% extends "base/base.html" %} {% load render_bundle from webpack_loader %} {% load staticfiles %} {% block title %} {{title}} {% endblock %} {% block content %} <div id="container"></div> {% with script=script_name %} {% render_bundle script 'js' %} {% endwith %} {% endblock %}
assets\js\index.jsx:
This is our react class.
var React = require('react'); var ReactDOM = require('react-dom'); var createReactClass = require('create-react-class'); var App = createReactClass({ render: function() { return ( <h1> React App Page </h1> ) } }); ReactDOM.render(<App />, document.getElementById('container'));
Database Setup/Migration:
For this tutorial we used postgres. At this time please make sure you create your djangoApp db and user you specified in the settings.py file. Then run the following commands in order.
#Migrates the auth python manage.py migrate auth #migrates the rest python manage.py migrate #Create the user for accessing the django admin ui #This will ask you for user names and passwords. Don't make it the same as in your settings.py file. python manage.py createsuperuser
Start Server:
webpack -p python manage.py runserver
Your site is now running at http://localhost:8000.
Your admin site is now running at http://localhost:8000/admin/.
References:
I used this video as a guideline to get the project started. However some didn’t work right and needed to adjust and made adjustments to require just one template, etc.
You must be logged in to post a comment.