Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 17f4175

Browse files
committedJun 15, 2024
Added a student management system
1 parent 5b664d1 commit 17f4175

File tree

23 files changed

+715
-0
lines changed

23 files changed

+715
-0
lines changed
 
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
# Student Management System
2+
3+
## Overview
4+
5+
The Student Management System is a simple web application designed to manage students' information using CRUD (Create, Read, Update, Delete) functionalities. It allows users to add, view, update, and delete student records. This project is built using Python and Django framework.
6+
7+
## Features
8+
9+
- Add new student records
10+
- View all student records
11+
- Update existing student records
12+
- Delete student records
13+
14+
## Technologies Used
15+
16+
- Python
17+
- Django
18+
- SQLite (default database for Django)
19+
- HTML/CSS and Bootstrap for frontend
20+
21+
## Installation
22+
23+
### Prerequisites
24+
25+
- Python 3.x installed
26+
- Django installed (`pip install django`)
27+
28+
### Steps
29+
30+
1. **Clone the repository:**
31+
32+
```sh
33+
git clone https://github.com/yourusername/Student_management_system.git
34+
cd Student_management_system
35+
```
36+
37+
2. **Create a virtual environment and activate it:**
38+
39+
```sh
40+
python -m venv venv
41+
source venv/bin/activate # On Windows, use `venv\Scripts\activate`
42+
```
43+
44+
3. **Install dependencies:**
45+
46+
```sh
47+
pip install -r requirements.txt
48+
```
49+
50+
4. **Run migrations:**
51+
52+
```sh
53+
python manage.py migrate
54+
```
55+
56+
5. **Run the development server:**
57+
58+
```sh
59+
python manage.py runserver
60+
```
61+
62+
6. **Access the application:**
63+
64+
Open your web browser and go to `http://127.0.0.1:8000`
65+
66+
## Usage
67+
68+
### Add a New Student
69+
70+
1. Click on the "Add Student" link in the navigation tab.
71+
2. Fill out the form with the student's information.
72+
3. Click "Submit" to save the new student record.
73+
74+
### View Students
75+
76+
1. Click on the "View" button link in the students row.
77+
2. A students info will be displayed.
78+
79+
### Update a Student
80+
81+
1. Click on the "Edit" button link in the students row you want to update.
82+
2. Update the student's information in the form.
83+
3. Click "Submit" to save the changes.
84+
85+
### Delete a Student
86+
87+
1. Click on the "Delete" button link in the student row you want to delete.
88+
2. Confirm the deletion when prompted.
89+
90+
## Contributing
91+
1. Fork the repository
92+
2. Create a new branch (git checkout -b feature-branch)
93+
3. Commit your changes (git commit -am 'Add new feature')
94+
4. Push to the branch (git push origin feature-branch)
95+
5. Create a new Pull Request
96+
97+
## Contact
98+
If you have any questions or suggestions, feel free to open an issue or contact the project maintainers.
99+
100+
101+
This `README.md` file provides a clear overview of the project, how to install and run it, and how to use its features. Adjust the repository link and other details as needed for your specific project.
102+
103+

‎SYSTEM MANAGEMENT APPS/Student_management_system/django_project/__init__.py

Whitespace-only changes.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
"""
2+
ASGI config for django_project project.
3+
4+
It exposes the ASGI callable as a module-level variable named ``application``.
5+
6+
For more information on this file, see
7+
https://docs.djangoproject.com/en/5.0/howto/deployment/asgi/
8+
"""
9+
10+
import os
11+
12+
from django.core.asgi import get_asgi_application
13+
14+
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_project.settings')
15+
16+
application = get_asgi_application()
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
"""
2+
Django settings for django_project project.
3+
4+
Generated by 'django-admin startproject' using Django 5.0.4.
5+
6+
For more information on this file, see
7+
https://docs.djangoproject.com/en/5.0/topics/settings/
8+
9+
For the full list of settings and their values, see
10+
https://docs.djangoproject.com/en/5.0/ref/settings/
11+
"""
12+
13+
from pathlib import Path
14+
15+
# Build paths inside the project like this: BASE_DIR / 'subdir'.
16+
BASE_DIR = Path(__file__).resolve().parent.parent
17+
18+
19+
# Quick-start development settings - unsuitable for production
20+
# See https://docs.djangoproject.com/en/5.0/howto/deployment/checklist/
21+
22+
# SECURITY WARNING: keep the secret key used in production secret!
23+
SECRET_KEY = 'django-insecure-weeft8nl5p-wz+)(k2ye)uo2xiepnd18w6nstud@bjt*bp+a7^'
24+
25+
# SECURITY WARNING: don't run with debug turned on in production!
26+
DEBUG = True
27+
28+
ALLOWED_HOSTS = []
29+
30+
31+
# Application definition
32+
33+
INSTALLED_APPS = [
34+
'django.contrib.admin',
35+
'django.contrib.auth',
36+
'django.contrib.contenttypes',
37+
'django.contrib.sessions',
38+
'django.contrib.messages',
39+
'django.contrib.staticfiles',
40+
'students',
41+
]
42+
43+
MIDDLEWARE = [
44+
'django.middleware.security.SecurityMiddleware',
45+
'django.contrib.sessions.middleware.SessionMiddleware',
46+
'django.middleware.common.CommonMiddleware',
47+
'django.middleware.csrf.CsrfViewMiddleware',
48+
'django.contrib.auth.middleware.AuthenticationMiddleware',
49+
'django.contrib.messages.middleware.MessageMiddleware',
50+
'django.middleware.clickjacking.XFrameOptionsMiddleware',
51+
]
52+
53+
ROOT_URLCONF = 'django_project.urls'
54+
55+
TEMPLATES = [
56+
{
57+
'BACKEND': 'django.template.backends.django.DjangoTemplates',
58+
'DIRS': [],
59+
'APP_DIRS': True,
60+
'OPTIONS': {
61+
'context_processors': [
62+
'django.template.context_processors.debug',
63+
'django.template.context_processors.request',
64+
'django.contrib.auth.context_processors.auth',
65+
'django.contrib.messages.context_processors.messages',
66+
],
67+
},
68+
},
69+
]
70+
71+
WSGI_APPLICATION = 'django_project.wsgi.application'
72+
73+
74+
# Database
75+
# https://docs.djangoproject.com/en/5.0/ref/settings/#databases
76+
77+
DATABASES = {
78+
'default': {
79+
'ENGINE': 'django.db.backends.sqlite3',
80+
'NAME': BASE_DIR / 'db.sqlite3',
81+
}
82+
}
83+
84+
85+
# Password validation
86+
# https://docs.djangoproject.com/en/5.0/ref/settings/#auth-password-validators
87+
88+
AUTH_PASSWORD_VALIDATORS = [
89+
{
90+
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
91+
},
92+
{
93+
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
94+
},
95+
{
96+
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
97+
},
98+
{
99+
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
100+
},
101+
]
102+
103+
104+
# Internationalization
105+
# https://docs.djangoproject.com/en/5.0/topics/i18n/
106+
107+
LANGUAGE_CODE = 'en-us'
108+
109+
TIME_ZONE = 'UTC'
110+
111+
USE_I18N = True
112+
113+
USE_TZ = True
114+
115+
116+
# Static files (CSS, JavaScript, Images)
117+
# https://docs.djangoproject.com/en/5.0/howto/static-files/
118+
119+
STATIC_URL = 'static/'
120+
121+
# Default primary key field type
122+
# https://docs.djangoproject.com/en/5.0/ref/settings/#default-auto-field
123+
124+
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
"""
2+
URL configuration for django_project project.
3+
4+
The `urlpatterns` list routes URLs to views. For more information please see:
5+
https://docs.djangoproject.com/en/5.0/topics/http/urls/
6+
Examples:
7+
Function views
8+
1. Add an import: from my_app import views
9+
2. Add a URL to urlpatterns: path('', views.home, name='home')
10+
Class-based views
11+
1. Add an import: from other_app.views import Home
12+
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
13+
Including another URLconf
14+
1. Import the include() function: from django.urls import include, path
15+
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
16+
"""
17+
from django.contrib import admin
18+
from django.urls import path, include
19+
20+
urlpatterns = [
21+
path('admin/', admin.site.urls),
22+
path('', include('students.urls')),
23+
]
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
"""
2+
WSGI config for django_project project.
3+
4+
It exposes the WSGI callable as a module-level variable named ``application``.
5+
6+
For more information on this file, see
7+
https://docs.djangoproject.com/en/5.0/howto/deployment/wsgi/
8+
"""
9+
10+
import os
11+
12+
from django.core.wsgi import get_wsgi_application
13+
14+
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_project.settings')
15+
16+
application = get_wsgi_application()
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#!/usr/bin/env python
2+
"""Django's command-line utility for administrative tasks."""
3+
import os
4+
import sys
5+
6+
7+
def main():
8+
"""Run administrative tasks."""
9+
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_project.settings')
10+
try:
11+
from django.core.management import execute_from_command_line
12+
except ImportError as exc:
13+
raise ImportError(
14+
"Couldn't import Django. Are you sure it's installed and "
15+
"available on your PYTHONPATH environment variable? Did you "
16+
"forget to activate a virtual environment?"
17+
) from exc
18+
execute_from_command_line(sys.argv)
19+
20+
21+
if __name__ == '__main__':
22+
main()
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
asgiref==3.8.1
2+
Django==5.0.4
3+
sqlparse==0.5.0
4+
typing_extensions==4.11.0

‎SYSTEM MANAGEMENT APPS/Student_management_system/students/__init__.py

Whitespace-only changes.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from django.contrib import admin
2+
from .models import Student
3+
4+
# Register your models here.
5+
admin.site.register(Student)
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from django.apps import AppConfig
2+
3+
4+
class StudentsConfig(AppConfig):
5+
default_auto_field = 'django.db.models.BigAutoField'
6+
name = 'students'
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
from django import forms
2+
from .models import Student
3+
4+
class StudentForm(forms.ModelForm):
5+
class Meta:
6+
model = Student
7+
fields = ['student_number', 'first_name', 'last_name', 'email', 'field_of_study', 'gpa']
8+
labels = {
9+
'student_number': 'Student Number',
10+
'first_name': 'First Name',
11+
'last_name': 'Last Name',
12+
'email': 'Email',
13+
'field_of_study': 'Field of Study',
14+
'gpa': 'GPA'
15+
}
16+
widgets = {
17+
'student_number': forms.NumberInput(attrs={'class': 'form-control'}),
18+
'first_name': forms.TextInput(attrs={'class': 'form-control'}),
19+
'last_name': forms.TextInput(attrs={'class': 'form-control'}),
20+
'email': forms.EmailInput(attrs={'class': 'form-control'}),
21+
'field_of_study': forms.TextInput(attrs={'class': 'form-control'}),
22+
'gpa': forms.NumberInput(attrs={'class': 'form-control'}),
23+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Generated by Django 5.0.4 on 2024-04-15 15:16
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
initial = True
9+
10+
dependencies = [
11+
]
12+
13+
operations = [
14+
migrations.CreateModel(
15+
name='Student',
16+
fields=[
17+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
18+
('student_number', models.PositiveIntegerField()),
19+
('first_name', models.CharField(max_length=50)),
20+
('last_name', models.CharField(max_length=50)),
21+
('email', models.EmailField(max_length=100)),
22+
('field_of_study', models.CharField(max_length=50)),
23+
('gpa', models.FloatField()),
24+
],
25+
),
26+
]

‎SYSTEM MANAGEMENT APPS/Student_management_system/students/migrations/__init__.py

Whitespace-only changes.
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from django.db import models
2+
3+
# Create your models here.
4+
class Student(models.Model):
5+
student_number = models.PositiveIntegerField()
6+
first_name = models.CharField(max_length=50)
7+
last_name = models.CharField(max_length=50)
8+
email = models.EmailField(max_length=100)
9+
field_of_study = models.CharField(max_length=50)
10+
gpa = models.FloatField()
11+
12+
def __str__(self):
13+
return f'Student: {self.first_name} {self.last_name}'

‎SYSTEM MANAGEMENT APPS/Student_management_system/students/static/css/bootstrap.min.css

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
{% extends "students/base.html" %}
2+
3+
{% block body %}
4+
<h3 class="text-center m-4">Add Student</h3>
5+
{% if success %}
6+
<div class="alert alert-success" role="alert">
7+
The new student added successfully.
8+
<a href="{% url 'index' %}" class="alert-link">Go to Home Page.</a>
9+
</div>
10+
{% else %}
11+
<div class="row justify-content-center">
12+
<div class="col-6">
13+
<div class="card bg-light mb-3">
14+
<div class="card-header">
15+
<i class="fa-solid fa-address-card fa-lg"></i> Student Registration
16+
</div>
17+
<div class="card-body">
18+
<form action="{% url 'add' %}" method="POST">
19+
{% csrf_token %}
20+
{{ form.as_p }}
21+
<button type="submit" class="btn btn-primary">Add</button>
22+
<a href="{% url 'index' %}" class="btn btn-secondary">Cancel</a>
23+
</form>
24+
</div>
25+
</div>
26+
</div>
27+
</div>
28+
{% endif %}
29+
{% endblock %}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
{% load static %}
2+
<!DOCTYPE html>
3+
<html lang="en">
4+
<head>
5+
<meta charset="UTF-8" />
6+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
7+
<title>Student Management System</title>
8+
<link
9+
rel="stylesheet"
10+
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/all.min.css"
11+
/>
12+
<link href="{% static 'css/bootstrap.min.css' %}" rel="stylesheet" />
13+
</head>
14+
<body class="d-flex flex-column min-vh-100">
15+
<nav class="navbar navbar-expand-lg bg-primary" data-bs-theme="dark">
16+
<div class="container-fluid">
17+
<a class="navbar-brand" href="{% url 'index' %}">
18+
<i class="fa-solid fa-graduation-cap fa-lg"></i> Student Management
19+
System
20+
</a>
21+
<button
22+
class="navbar-toggler"
23+
type="button"
24+
data-bs-toggle="collapse"
25+
data-bs-target="#navbarColor01"
26+
aria-controls="navbarColor01"
27+
aria-expanded="false"
28+
aria-label="Toggle navigation"
29+
>
30+
<span class="navbar-toggler-icon"></span>
31+
</button>
32+
<div class="collapse navbar-collapse" id="navbarColor01">
33+
<ul class="navbar-nav me-auto">
34+
<li class="nav-item">
35+
<a class="nav-link" href="{% url 'index' %}">
36+
<i class="fa-solid fa-list fa-lg"></i> All Students
37+
</a>
38+
</li>
39+
<li class="nav-item">
40+
<a class="nav-link" href="{% url 'add' %}">
41+
<i class="fa-solid fa-plus fa-lg"></i> Add Student
42+
</a>
43+
</li>
44+
</ul>
45+
</div>
46+
</div>
47+
</nav>
48+
<div class="container-fluid">
49+
{% block body %}
50+
{% endblock %}
51+
</div>
52+
<footer class="mt-auto mb-4">
53+
<div class="text-center">
54+
<span>
55+
Copyright &copy;
56+
<script>
57+
document.write(new Date().getFullYear());
58+
</script>
59+
Kiringabakwe Ibrahim.
60+
</span>
61+
</div>
62+
</footer>
63+
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.min.js"></script>
64+
</body>
65+
</html>
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
{% extends "students/base.html" %}
2+
3+
{% block body %}
4+
<h3 class="text-center m-4">Update Student</h3>
5+
{% if success %}
6+
<div class="alert alert-success" role="alert">
7+
The student updated successfully.
8+
<a href="{% url 'index' %}" class="alert-link">Go to Home Page.</a>
9+
</div>
10+
{% else %}
11+
<div class="row justify-content-center">
12+
<div class="col-6">
13+
<div class="card bg-light mb-3">
14+
<div class="card-header">
15+
<i class="fa-solid fa-pen-to-square fa-lg"></i> Update Student Records
16+
</div>
17+
<div class="card-body">
18+
<form action="#" method="POST">
19+
{% csrf_token %}
20+
{{ form.as_p }}
21+
<button type="submit" class="btn btn-primary">Update</button>
22+
<a href="{% url 'index' %}" class="btn btn-secondary">Cancel</a>
23+
</form>
24+
</div>
25+
</div>
26+
</div>
27+
</div>
28+
{% endif %}
29+
{% endblock %}
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
{% extends "students/base.html" %}
2+
3+
{% block body %}
4+
<h3 class="m-4">All Students</h3>
5+
<div class="row">
6+
<div class="col-12">
7+
{% if students %}
8+
<div class="card bg-light ms-4 me-4 mb-4">
9+
<div class="card-header">
10+
<i class="fa-solid fa-list fa-lg"></i> Student Records
11+
</div>
12+
<div class="card-body">
13+
<p class="card-text">
14+
<div class="table-responsive">
15+
<table class="table table-hover">
16+
<thead>
17+
<tr>
18+
<th scope="col">Student Number</th>
19+
<th scope="col">First Name</th>
20+
<th scope="col">Last Name</th>
21+
<th scope="col">Email</th>
22+
<th scope="col">Field of Study</th>
23+
<th scope="col">GPA</th>
24+
<th scope="col">Actions</th>
25+
</tr>
26+
</thead>
27+
<tbody>
28+
{% for student in students %}
29+
<tr>
30+
<td>{{ student.student_number }}</td>
31+
<td>{{ student.first_name }}</td>
32+
<td>{{ student.last_name }}</td>
33+
<td>{{ student.email }}</td>
34+
<td>{{ student.field_of_study }}</td>
35+
<td>{{ student.gpa }}</td>
36+
<td>
37+
<button type="button" class="btn btn-success me-1" href="{% url 'view_student' student.id %}" data-bs-toggle="modal" data-bs-target="#myModal{{student.id}}">
38+
<i class="fa-solid fa-circle-info fa-lg"></i>
39+
</button>
40+
41+
<!-- Modal view Student -->
42+
<div class="modal" id="myModal{{student.id}}" tabindex="-1" aria-labelledby="myModalLabel1" aria-hidden="true">
43+
<div class="modal-dialog" role="document">
44+
<div class="modal-content">
45+
<div class="modal-header">
46+
<h5 class="modal-title">
47+
Student: {{ student.first_name }} {{ student.last_name }}
48+
</h5>
49+
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close">
50+
<span aria-hidden="true"></span>
51+
</button>
52+
</div>
53+
<div class="modal-body">
54+
<ul class="list-unstyled">
55+
<li>Student Number: <strong>{{ student.student_number }}</strong></li>
56+
<li>First Name: <strong>{{ student.first_name }}</strong></li>
57+
<li>Last Name: <strong>{{ student.last_name }}</strong></li>
58+
<li>Email: <strong>{{ student.email }}</strong></li>
59+
<li>Field of Study: <strong>{{ student.field_of_study }}</strong></li>
60+
<li>GPA: <strong>{{ student.gpa }}</strong></li>
61+
</ul>
62+
</div>
63+
<div class="modal-footer">
64+
<button type="button" class="btn btn-primary" data-bs-dismiss="modal">Close</button>
65+
</div>
66+
</div>
67+
</div>
68+
</div>
69+
70+
<a class="btn btn-warning me-1" href="{% url 'edit' student.id %}">
71+
<i class="fa-solid fa-pen-to-square fa-lg"></i>
72+
</a>
73+
74+
<button type="button" class="btn btn-danger" data-bs-toggle="modal" data-bs-target="#delete{{student.id}}">
75+
<i class="fa-solid fa-trash-can fa-lg"></i>
76+
</button>
77+
78+
<!-- Modal delete Student -->
79+
<div class="modal" id="delete{{student.id}}" tabindex="-1" aria-labelledby="myModalLabel2" aria-hidden="true">
80+
<div class="modal-dialog" role="document">
81+
<div class="modal-content">
82+
<div class="modal-header">
83+
<h5 class="modal-title">
84+
Student: {{ student.first_name }} {{ student.last_name }}
85+
</h5>
86+
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close">
87+
<span aria-hidden="true"></span>
88+
</button>
89+
</div>
90+
<div class="modal-body">
91+
<p>Are you sure you want to delete this student?</p>
92+
</div>
93+
<div class="modal-footer">
94+
<form action="{% url 'delete' student.id %}" method="POST">
95+
{% csrf_token %}
96+
<input type="submit" class="btn btn-primary" value="Delete">
97+
</form>
98+
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>
99+
</div>
100+
</div>
101+
</div>
102+
</div>
103+
</td>
104+
</tr>
105+
{% endfor %}
106+
</tbody>
107+
</table>
108+
</div>
109+
</p>
110+
</div>
111+
</div>
112+
{% else %}
113+
<h5 class="alert alert-primary ms-4 me-4">No Student Records</h5>
114+
{% endif %}
115+
</div>
116+
</div>
117+
{% endblock %}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from django.test import TestCase
2+
3+
# Create your tests here.
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from django.urls import path
2+
from . import views
3+
4+
urlpatterns = [
5+
path('', views.index, name='index'),
6+
path('<int:id>', views.view_student, name='view_student'),
7+
path('add/', views.add, name='add'),
8+
path('edit/<int:id>/', views.edit, name='edit'),
9+
path('delete/<int:id>/', views.delete, name='delete'),
10+
]
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
from django.http import HttpResponseRedirect
2+
from django.shortcuts import render
3+
from django.urls import reverse
4+
5+
from .models import Student
6+
from .forms import StudentForm
7+
8+
# Create your views here.
9+
def index(request):
10+
return render(request, 'students/index.html', {
11+
'students': Student.objects.all()
12+
})
13+
14+
def view_student(request, id):
15+
student = Student.objects.get(pk=id)
16+
return HttpResponseRedirect(reverse('index'))
17+
18+
def add(request):
19+
if request.method == 'POST':
20+
form = StudentForm(request.POST)
21+
if form.is_valid():
22+
new_student_number = form.cleaned_data['student_number']
23+
new_first_name = form.cleaned_data['first_name']
24+
new_last_name = form.cleaned_data['last_name']
25+
new_email = form.cleaned_data['email']
26+
new_field_of_study = form.cleaned_data['field_of_study']
27+
new_gpa = form.cleaned_data['gpa']
28+
29+
new_student = Student(
30+
student_number = new_student_number,
31+
first_name = new_first_name,
32+
last_name = new_last_name,
33+
email = new_email,
34+
field_of_study = new_field_of_study,
35+
gpa = new_gpa
36+
)
37+
new_student.save()
38+
return render(request, 'students/add.html', {
39+
'form': StudentForm(),
40+
'success': True
41+
})
42+
else:
43+
form = StudentForm()
44+
return render(request, 'students/add.html', {
45+
'form': StudentForm()
46+
})
47+
48+
def edit(request, id):
49+
if request.method == 'POST':
50+
student = Student.objects.get(pk=id)
51+
form = StudentForm(request.POST, instance=student)
52+
if form.is_valid():
53+
form.save()
54+
return render(request, 'students/edit.html', {
55+
'form': form,
56+
'success': True
57+
})
58+
else:
59+
student = Student.objects.get(pk=id)
60+
form = StudentForm(instance=student)
61+
return render(request, 'students/edit.html', {
62+
'form': form
63+
})
64+
65+
def delete(request, id):
66+
if request.method == 'POST':
67+
student = Student.objects.get(pk=id)
68+
student.delete()
69+
return HttpResponseRedirect(reverse('index'))

0 commit comments

Comments
 (0)
Please sign in to comment.