-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathimproved_admin.py
62 lines (47 loc) · 2.12 KB
/
improved_admin.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
from django.contrib import admin
from django.contrib.admin.sites import AdminSite
from django.db import models
import django.forms as forms
from recruitment.models import ExtraField
EXCLUDED_FIELDS = [ExtraField]
from datetime import date
from django.utils.translation import gettext_lazy as _
# This filter exposes all years in descending order, with
# the newest year at the top
class SortedFairYear(admin.SimpleListFilter):
# Human-readable title which will be displayed in the
# right admin sidebar just above the filter options.
title = _("Fair year")
# Parameter for the filter that will be used in the URL query.
parameter_name = "fair"
def lookups(self, request, model_admin):
# Query to get distinct fairs ordered by year
queryset = (
model_admin.model.objects.select_related("fair")
.order_by("-fair__year")
.distinct("fair__year", "fair")
)
# Creating a list of tuples in the format (fair_id, fair.year)
return [(obj.fair.id, obj.fair.year) for obj in queryset]
def queryset(self, request, queryset):
# Only fetches the fields related to the selected fair year
if self.value():
queryset = queryset.filter(fair__id=self.value())
return queryset
# Own subclass of ModelAdmin to override appearances of forms on admin panel.
class ModelAdminImproved(admin.ModelAdmin):
# Default search field, will need to be overridden for models without a name field
search_fields = ("name",)
def __init__(self, model, admin_site: AdminSite | None):
super().__init__(model, admin_site)
# Overrides get_autocomplete_fields to be all foreignkey fields.
def get_autocomplete_fields(self, request):
autocomplete_fields = []
for field in self.model._meta.fields:
if isinstance(field, (models.ForeignKey)):
if field.related_model not in EXCLUDED_FIELDS:
autocomplete_fields.append(field.name)
return autocomplete_fields
formfield_overrides = {
models.ManyToManyField: {"widget": forms.CheckboxSelectMultiple()},
}