Make students filterable

This commit is contained in:
Zaki Benaissa 2024-01-05 18:49:15 +01:00
parent a59ccae6d5
commit 90942980fc
4 changed files with 59 additions and 27 deletions

View File

@ -1,6 +1,6 @@
from django.db.models import Q
import django_filters
from .models import User
from .models import User, Student
class LecturerFilter(django_filters.FilterSet):
@ -16,16 +16,56 @@ class LecturerFilter(django_filters.FilterSet):
super().__init__(*args, **kwargs)
# Change html classes and placeholders
self.filters["username"].field.widget.attrs.update({"class": "au-input"})
self.filters["username"].field.widget.attrs.update({"placeholder": "ID No."})
self.filters["name"].field.widget.attrs.update({"class": "au-input"})
self.filters["name"].field.widget.attrs.update({"placeholder": "Name"})
self.filters["email"].field.widget.attrs.update({"class": "au-input"})
self.filters["email"].field.widget.attrs.update({"placeholder": "Email"})
self.filters["username"].field.widget.attrs.update(
{"class": "au-input", "placeholder": "ID No."}
)
self.filters["name"].field.widget.attrs.update(
{"class": "au-input", "placeholder": "Name"}
)
self.filters["email"].field.widget.attrs.update(
{"class": "au-input", "placeholder": "Email"}
)
def filter_by_name(self, queryset, name, value):
return queryset.filter(
Q(first_name__icontains=value) | Q(last_name__icontains=value)
)
class StudentFilter(django_filters.FilterSet):
student__username = django_filters.CharFilter(lookup_expr="exact", label="")
student__name = django_filters.CharFilter(method="filter_by_name", label="")
student__email = django_filters.CharFilter(lookup_expr="icontains", label="")
department__title = django_filters.CharFilter(lookup_expr="icontains", label="")
class Meta:
model = Student
fields = [
"student__username",
"student__name",
"student__email",
"department__title",
]
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# Change html classes and placeholders
self.filters["student__username"].field.widget.attrs.update(
{"class": "au-input", "placeholder": "ID No."}
)
self.filters["student__name"].field.widget.attrs.update(
{"class": "au-input", "placeholder": "Name"}
)
self.filters["student__email"].field.widget.attrs.update(
{"class": "au-input", "placeholder": "Email"}
)
self.filters["department__title"].field.widget.attrs.update(
{"class": "au-input", "placeholder": "Department"}
)
def filter_by_name(self, queryset, name, value):
return queryset.filter(
Q(student__first_name__icontains=value)
| Q(student__last_name__icontains=value)
)

View File

@ -14,7 +14,7 @@ from .views import (
admin_panel,
profile_update,
change_password,
LecturerListView,
LecturerFilterView,
StudentListView,
staff_add_view,
edit_staff,
@ -37,7 +37,7 @@ urlpatterns = [
path("profile/<int:id>/detail/", profile_single, name="profile_single"),
path("setting/", profile_update, name="edit_profile"),
path("change_password/", change_password, name="change_password"),
path("lecturers/", LecturerListView.as_view(), name="lecturer_list"),
path("lecturers/", LecturerFilterView.as_view(), name="lecturer_list"),
path("lecturer/add/", staff_add_view, name="add_lecturer"),
path("staff/<int:pk>/edit/", edit_staff, name="staff_edit"),
path("lecturers/<int:pk>/delete/", delete_staff, name="lecturer_delete"),

View File

@ -14,7 +14,7 @@ from result.models import TakenCourse
from .decorators import admin_required
from .forms import StaffAddForm, StudentAddForm, ProfileUpdateForm, ParentAddForm
from .models import User, Student, Parent
from .filters import LecturerFilter
from .filters import LecturerFilter, StudentFilter
def validate_username(request):
@ -261,7 +261,7 @@ def edit_staff(request, pk):
@method_decorator([login_required, admin_required], name="dispatch")
class LecturerListView(FilterView):
class LecturerFilterView(FilterView):
filterset_class = LecturerFilter
queryset = User.objects.filter(is_lecturer=True)
template_name = "accounts/lecturer_list.html"
@ -351,16 +351,10 @@ def edit_student(request, pk):
@method_decorator([login_required, admin_required], name="dispatch")
class StudentListView(ListView):
class StudentListView(FilterView):
filterset_class = StudentFilter
template_name = "accounts/student_list.html"
paginate_by = 10 # if pagination is desired
def get_queryset(self):
queryset = Student.objects.all()
query = self.request.GET.get("student_id")
if query is not None:
queryset = queryset.filter(Q(department=query))
return queryset
paginate_by = 10
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)

View File

@ -29,11 +29,9 @@
<div class="content-center">
<form class="search-form" action="" method="get">
<input class="au-input" type="text" id="student_id" name="student_id" placeholder="ID No." value="{{ request.GET.student_id }}"/>
<input class="au-input" type="text" name="name" placeholder="Name" value="{{ request.GET.name }}"/>
<input class="au-input" type="text" name="department" placeholder="Department" value="{{ request.GET.department }}"/>
{{ filter.form }}
<button class="btn btn-light" type="submit">
<i class="fas fa-search"></i> filter
<i class="fas fa-search"></i> Filter
</button>
</form>
</div>
@ -63,7 +61,7 @@
</tr>
</thead>
<tbody>
{% for student in object_list %}
{% for student in filter.qs %}
<tr>
<td> {{ forloop.counter }}.</td>
<td>{{ student.student.username }} </td>