About Django Student Application
This student application achieves a reporting tool for subject and marks of the student
Based on the subject filtering, this application generates a brief report on student marks (Beautiful Pie Chart)
Download Application
Prerequisites
Python
Django
MySQL
HighCharts
Jqury
JavaScript Modules Used
Highcharts
Jquery
Steps to install Student Application
django-admin.py startproject StudentWebsite
python manage.py startapp StudentApp
python manage.py validate
python manage.py sqlall StudentApp
MySQL Database Details
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'studentsdb',
'USER': 'XXXX',
'PASSWORD': 'XXXX',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
Insert MySQL sample data
Note: You can either add the data from Admin page (one by one) or Load/Import sample "studentapp.sql" into database
Database Models Used:
Student
Subject
StudentMarks
How to start Django
Development Server
Django develeopment server works on default port 8000
python manage.py runserver 8000
Access Home Page
http://127.0.0.1:8000/home/
How Application Looks
![]() |
| Select the desired subject |
![]() |
| After selecting the subject as Physics - Generates the report as above |
models.py
#-*- encoding=UTF-8 -*-
from django.db import models
from django.core.exceptions import ValidationError
import re
class Student(models.Model):
firstname = models.CharField(max_length=30, null=False, blank=False)
lastname = models.CharField(max_length=30, null=False, blank=False)
def clean(self):
if re.match(r'^\s+$', self.firstname):
raise ValidationError('Firstname should contain some characters, only spaces not allowed')
if re.match(r'^\s+$', self.lastname):
raise ValidationError('Lastname should contain some characters, only spaces not allowed')
def __unicode__(self):
return u'%s %s' % (self.firstname, self.lastname)
class Meta:
unique_together = (("firstname", "lastname"),)
ordering = ['firstname']
class Subject(models.Model):
name = models.CharField(max_length=10, unique=True, null=False, blank=False)
def clean(self):
if re.match(r'^\s+$', self.name):
raise ValidationError('Subject should contain some characters, only spaces not allowed')
def __unicode__(self):
return u'%s' % (self.name)
class StudentMarks(models.Model):
student = models.ForeignKey(Student)
subject = models.ForeignKey(Subject)
marks = models.IntegerField(max_length=3, null=False, blank=False)
class Meta:
unique_together = (("student", "subject"),)
urls.py
from django.conf.urls import patterns, include, url
# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
# Examples:
# url(r'^$', 'StudentWebsite.views.home', name='home'),
# url(r'^StudentWebsite/', include('StudentWebsite.foo.urls')),
# Uncomment the admin/doc line below to enable admin documentation:
url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
# Uncomment the next line to enable the admin:
url(r'^admin/', include(admin.site.urls)),
)
urlpatterns += patterns('StudentWebsite.StudentApp.views',
#url(r'^$', 'home'),
url(r'^home/$', 'subjectView', name="home"),
url(r'^getMarksDetailsView/(?P\w+)/$', 'getMarksDetailsView', name="getMarksDetailsView"),
)
views.py
#-*- encoding=UTF-8 -*-
from django.http import HttpResponse, HttpResponseRedirect, Http404
#from django.http import *
from django.shortcuts import render, render_to_response
from django.core.urlresolvers import reverse
from StudentWebsite.StudentApp.models import Subject, Student, StudentMarks
from django.db.models import Avg, Count
def subjectView(request):
subjectList = Subject.objects.values('pk', 'name')
side_bar = {'Home':'home', 'Admin' : 'admin:index'}
return render(request, 'StudentsMain.html', {'subjects' : subjectList, 'side_bar' : side_bar})
def getMarksDetailsView(request, subjectName):
subjectStudentDetails = StudentMarks.objects.filter(subject__name=subjectName).values('student__firstname', 'student__lastname', 'subject__name', 'marks')
avgSubjectMarks = Subject.objects.filter(name=subjectName).annotate(average_rating=Avg('studentmarks__marks'))[0].average_rating
side_bar = {'Home':'home', 'Admin' : 'admin:index'}
ranges = [ '0-40', '41-60', '61-80', '81-90', '91-100']
marksRange = {}
for eachRange in ranges:
count = StudentMarks.objects.filter(subject__name=subjectName).filter(marks__range=(eachRange.split('-'))).count()
marksRange[eachRange] = count
return render(request, 'StudentSubjectDetails.html', {'subjectStudentDetails' : subjectStudentDetails, 'avgSubjectMarks' : avgSubjectMarks, 'side_bar' : side_bar, 'marksRange' : marksRange, 'subjectName' : subjectName.title() })
admin.py
from django.contrib import admin
from StudentWebsite.StudentApp.models import Student, Subject, StudentMarks
#This is just for dispaly order of columns for Author
class StudentAdmin(admin.ModelAdmin):
list_display = ('firstname', 'lastname')
search_fields = ('firstname', 'lastname')
ordering = ('-firstname',)
class SubjectAdmin(admin.ModelAdmin):
list_display = ('name',)
list_filter = ('name',)
ordering = ('-name',)
fields = ('name',)
class StudentMarksAdmin(admin.ModelAdmin):
list_display = ('student', 'subject', 'marks')
list_filter = ('student', 'subject', 'marks')
ordering = ('-student',)
admin.site.register(Student, StudentAdmin) #StudentAdmin is just for display in Admin page
admin.site.register(Subject, SubjectAdmin) #SubjectAdmin is just for display in Admin page
admin.site.register(StudentMarks, StudentMarksAdmin)

