Introduction
In Part 1 of this tutorial we successfully installed Django. In this tutorial we will build our first Django app. We will build a Personal Budget where you will be able to:- Enter an expense on a web page
- View bar graphs of your expenses on a web page
Objective
In this tutorial we will:- Configure Django to use MySQL
- Configure Django to use Apache
- Install and configure django-chartit to display pretty graphs
- Create our Personal Budget Django App
Assumptions
- Fresh Install of Ubuntu Server 14.10
- SSH enabled (sudo apt-get install ssh-server)
- User has root privileges
- Basic familiarity with using the Linux command line (terminal)
- Have completed installation steps outlined in Part 1 of this tutorial
Installation
Step 1 - Configure Django to use MySQL
Open the settings.py file
vim /var/www/html/projects/webapps/webapps/settings.py
Comment or Replace the Database section with the following
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django',
'USER': 'django',
'PASSWORD': 'django',
'HOST': 'localhost', # Or an IP Address that your DB is hosted on
'PORT': '3306',
}
}
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django',
'USER': 'django',
'PASSWORD': 'django',
'HOST': 'localhost', # Or an IP Address that your DB is hosted on
'PORT': '3306',
}
}
Step 2 - Configure Django to use Apache
Take and backup and open the Apache's configuration file
mv /etc/apache2/sites-enabled/000-default.conf /etc/apache2/sites-enabled/000-default.conf.bak
vim /etc/apache2/sites-enabled/000-default.conf
Insert the following configurationvim /etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80> # The ServerName directive sets the request scheme, hostname and port that # the server uses to identify itself. This is used when creating # redirection URLs. In the context of virtual hosts, the ServerName # specifies what hostname must appear in the request's Host: header to # match this virtual host. For the default virtual host (this file) this # value is not decisive as it is used as a last resort host regardless. # However, you must set it for any further virtual host explicitly. #ServerName www.example.com WSGIDaemonProcess webapps python-path=/var/www/html/projects/webapps:/var/www/html/projects/lib/python2.7/site-packages WSGIProcessGroup webapps WSGIScriptAlias / /var/www/html/projects/webapps/webapps/wsgi.py ServerAdmin webmaster@localhost DocumentRoot /var/www/html Alias /static/ /var/www/html/projects/local/lib/python2.7/site-packages/django/contrib/admin/static/ <Directory /var/www/html/projects/local/lib/python2.7/site-packages/django/contrib/admin/static/> Require all granted </Directory> # Available loglevels: trace8, ..., trace1, debug, info, notice, warn, # error, crit, alert, emerg. # It is also possible to configure the loglevel for particular # modules, e.g. #LogLevel info ssl:warn ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined # For most configuration files from conf-available/, which are # enabled or disabled at a global level, it is possible to # include a line for only one particular virtual host. For example the # following line enables the CGI configuration for this host only # after it has been globally disabled with "a2disconf". #Include conf-available/serve-cgi-bin.conf </VirtualHost> # vim: syntax=apache ts=4 sw=4 sts=4 sr noet
service apache2 restart
Open your browser and Navigate to your servers URL (http://your-server-ip). The Django webpage should be displayedStep 3 - Install and configure Chartit
cd /var/www/html/projects/
. bin/activate
pip install django-chartit
pip install simplejson
cd /var/www/html/projects/local/lib/python2.7/site-packages/django/contrib/admin/static/
cp -R /var/www/html/projects/local/lib/python2.7/site-packages/chartit/static/chartit/ .
Find and Replace 'from django.utils import simplejson' with 'import simplejson' in the following file. bin/activate
pip install django-chartit
pip install simplejson
cd /var/www/html/projects/local/lib/python2.7/site-packages/django/contrib/admin/static/
cp -R /var/www/html/projects/local/lib/python2.7/site-packages/chartit/static/chartit/ .
vim /var/www/html/projects/lib/python2.7/site-packages/chartit/templatetags/chartit.py
Step 4 - Create a Django App and call it budget
cd /var/www/html/projects/
. bin/activate
cd webapps/
python manage.py startapp budget
. bin/activate
cd webapps/
python manage.py startapp budget
Step 5 - Create a Django Model
Edit the following file
vim /var/www/html/projects/webapps/budget/models.py
Delete the contents and insert the following: from django.db import models # Create your models here. category_choices = (('Housing','Housing'), ('Transportation','Transportation'), ('Personal','Personal'), ('Vacation','Vacation'), ('Savings', 'Savings')) class Expense(models.Model): expense_date = models.DateField('date published') category_text = models.CharField(choices=category_choices,max_length=50) description_text = models.CharField(max_length=200) expense_value = models.DecimalField(default=0, max_digits=10, decimal_places=2)
- Created categories for our expenses like Housing, Transportation etc.
- Created various database fields. When we enter expenses we will have the ability to:
- Enter a date for the expense
- Choose a category for the expense
- Provide a description for the expense
- Enter the expense value
Step 6 - Enable our newly created app (budget) and installed app (chartit)
Edit the following file
vim /var/www/html/projects/webapps/webapps/settings.py
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'budget', 'chartit', )
Step 7 - Run migrations on your Models
python manage.py makemigrations budget
python manage.py sqlmigrate budget 0001
python manage.py migrate
python manage.py sqlmigrate budget 0001
python manage.py migrate
Step 8 - Create an Admin account
(projects)root@django:/var/www/html/projects/webapps# cd /var/www/html/projects/
(projects)root@django:/var/www/html/projects/webapps# python manage.py createsuperuser
Username (leave blank to use 'root'): admin
Email address: admin@admin.com
Password:
Password (again):
Superuser created successfully.
Navigate to the server http://your-server-ip/admin. Enter your credentials and verify you can access the admin console.(projects)root@django:/var/www/html/projects/webapps# python manage.py createsuperuser
Username (leave blank to use 'root'): admin
Email address: admin@admin.com
Password:
Password (again):
Superuser created successfully.
Step 9 - Add our app to the Admin site
from django.contrib import admin from budget.models import Expense class ExpenseAdmin(admin.ModelAdmin): fields = ['expense_date', 'category_text', 'description_text', 'expense_value'] list_display = ('expense_date', 'category_text', 'description_text', 'expense_value') list_filter = ['category_text'] search_fields = ['description_text', 'expense_value'] admin.site.register(Expense, ExpenseAdmin)
service apache2 restart
Navigate to the Admin site. There should be an option to add expenses. Add a few expensesStep 10 - Create a Django Views to display the expense graphs
cd /var/www/html/projects/webapps/budget/ mv views.py views.py.bak vim views.py
from django.shortcuts import render, render_to_response from django.db.models import * # Create your views here. from chartit import DataPool, Chart, PivotDataPool, PivotChart from budget.models import * #Create a data source total_per_category_pivot = \ PivotDataPool( series= [{'options': { 'source': Expense.objects.all().values(), 'categories': [‘category_text']}, 'terms': { 'sum' : Sum('expense_value')}}]) chart1 = PivotChart( datasource = total_per_category_pivot, series_options = [{'options':{ 'type': 'column', 'stacking': False}, 'terms':[ 'sum']}], chart_options = {'title': { 'text': 'Total Expenditure per Category'}, 'xAxis': { 'title': { 'text': 'Categories'}}}) #Step 3: Send the chart object to the template. return render(request, 'budget/index.html',{'totalpermonth': [chart1]})
Step 11 - Create a Web Template to display the graphs
cd /var/www/html/projects/webapps/budget/ mkdir templates cd templates mkdir budget cd budget vim index.html <head> {% load staticfiles %} <!-- code to include the highcharts and jQuery libraries goes here --> <!-- load_charts filter takes a comma-separated list of id's where --> <!-- the charts need to be rendered to --> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script> <script src="http://code.highcharts.com/highcharts.js" type="text/javascript"></script> <script src="/highcharts.js" type="text/javascript"></script> {% load chartit %} {{ totalpermonth|load_charts:"chart1" }} </head> <body> <div id="chart1"> Chart will be rendered here </div> </body>
Step 12 - Edit budget url.py file
cd /var/www/html/projects/webapps/budget/ vim urls.py
from django.conf.urls import patterns, url from budget import views urlpatterns = patterns('', url(r'^$', views.total, name='total'), )
Step 13 - Edit the urls.py file for the project webapps
cd /var/www/html/projects/webapps/webapps/ vim urls.py
from django.conf.urls import patterns, include, url from django.contrib import admin urlpatterns = patterns('', # Examples: # url(r'^$', 'webapps.views.home', name='home'), # url(r'^blog/', include('blog.urls')), url(r'^admin/', include(admin.site.urls)), url(r'^total/', include('budget.urls')), )
Restart Apache and check out the fancy bar graph
service apache2 restart
Navigate to http://your-server-ip/total and you should see a graph load as long as your server can communicate over the Internet with highcharts and javascript web servers
Comments
Post a Comment