Advanced¶
Advanced configuration examples and third-party widget integrations.
See also
The Third-party widgets (AJAX search) provides a complete, end-to-end recipe for integrating third-party AJAX widgets.
Widgets¶
Default single-select:
forms.SelectDefault multi-select:
forms.FilteredSelectMultipleCustom: Any Django form widget, including those from third-party apps like django-autocomplete-light, can be provided via
ReverseRelationConfig.widget.
Example: django-autocomplete-light
Provide a custom widget via ReverseRelationConfig.widget for large datasets.
from django.contrib import admin
from dal import autocomplete
from django.db.models import Q
from myapp.models import Company, Department
from django_admin_reversefields.mixins import ReverseRelationAdminMixin, ReverseRelationConfig
def company_department_queryset(queryset, instance, request):
"""Allow binding to departments that are unbound or already tied to ``instance``."""
if instance and instance.pk:
return queryset.filter(Q(company__isnull=True) | Q(company=instance))
return queryset.filter(company__isnull=True)
class DepartmentAutocomplete(autocomplete.Select2QuerySetView):
def get_queryset(self):
qs = Department.objects.all()
term = (self.q or "").strip()
if term:
qs = qs.filter(name__icontains=term)
return qs.order_by("name")
@admin.register(Company)
class CompanyAdmin(ReverseRelationAdminMixin, admin.ModelAdmin):
reverse_relations = {
"department_binding": ReverseRelationConfig(
model=Department,
fk_field="company",
widget=autocomplete.ModelSelect2(
url="department-autocomplete", attrs={"data-minimum-input-length": 2}
),
limit_choices_to=company_department_queryset,
)
}
Example: django-unfold
Override the default widgets to match your admin theme, for example when using django-unfold.
Note
These examples require django-unfold to be installed and configured
in your project.
Override the default forms.Select with Unfold’s styled version.
from unfold.widgets import UnfoldAdminSelectWidget
@admin.register(Company)
class CompanyAdmin(ReverseRelationAdminMixin, admin.ModelAdmin):
reverse_relations = {
"department_binding": ReverseRelationConfig(
model=Department,
fk_field="company",
widget=UnfoldAdminSelectWidget(),
)
}
Use Unfold’s Select2 widget for a better user experience.
from unfold.widgets import UnfoldAdminSelect2Widget
@admin.register(Company)
class CompanyAdmin(ReverseRelationAdminMixin, admin.ModelAdmin):
reverse_relations = {
"department_binding": ReverseRelationConfig(
model=Department,
fk_field="company",
widget=UnfoldAdminSelect2Widget(),
)
}