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)