Custom Django admin mixin and widgets for handling generic foreign keys (GFKs) more intuitively.
- PrettyGFKModelAdminMixin: A mixin that enhances Django's admin interface for models with GFKs.
- ForeignKeyContentIdWidget: A raw ID widget with a fallback URL to prevent errors.
- ContentTypeSelect: A dropdown widget that dynamically updates related object selection and resets the foreign key field when the content type changes.
pip install admin_pretty_gfkfrom admin_pretty_gfk.mixins import PrettyGFKModelAdminMixin
from django.contrib import admin
class AdvertAdmin(PrettyGFKModelAdminMixin, admin.ModelAdmin):
passfrom admin_pretty_gfk.widgets import ContentTypeSelect, ForeignKeyContentIdWidget
from django import forms
from django.contrib import admin
from django.core.exceptions import ObjectDoesNotExist
from django.db.models import ManyToOneRel
from common.models import Buy, Sell, Rent, Advert
class AdvertModelForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(AdvertModelForm, self).__init__(*args, **kwargs)
try:
model = self.instance.content_type.model_class()
model_key = model._meta.pk.name
except (AttributeError, ObjectDoesNotExist):
model = self.fields['content_type'].queryset[0].model_class()
model_key = 'id'
self.fields['object_id'].widget = ForeignKeyContentIdWidget(
rel=ManyToOneRel(model_key, model, 'id'),
admin_site=admin.site
)
class Meta:
model = Advert
fields = "__all__"
widgets = {
'content_type': ContentTypeSelect
}
class AdvertAdmin(admin.ModelAdmin):
form = AdvertModelFormadmin.site.register(Buy)
admin.site.register(Sell)
admin.site.register(Rent)
admin.site.register(Advert, AdvertAdmin)PrettyGFKModelAdminMixinautomates form handling for models with GFKs.ContentTypeSelectupdates object selection dynamically when the content type changes.ForeignKeyContentIdWidgetensures proper URL handling for related objects.
Default create form
Create form with admin_pretty_gfk
Default edit object form
Edit object form with admin_pretty_gfk

This project is licensed under the MIT License.