Django Admin: OneToOne Relation as an Inline? Django Admin: OneToOne Relation as an Inline? django django

Django Admin: OneToOne Relation as an Inline?


It's perfectly possible to use an inline for a OneToOne relationship. However, the actual field defining the relationship has to be on the inline model, not the parent one - in just the same way as for a ForeignKey. Switch it over and it will work.

Edit after comment: you say the parent model is already registered with the admin: then unregister it and re-register.

from original.satchmo.admin import ProductAdminclass MyProductInline(admin.StackedInline):    model = MyProductclass ExtendedProductAdmin(ProductAdmin):    inlines = ProductAdmin.inlines + (MyProductInline,)admin.site.unregister(Product)admin.site.register(Product, ExtendedProductAdmin)

Update 2020 (Django 3.1.1)

This method is still working but some types has changed in new Django version since inlines in ExtendedProductAdmin should now be added as list and not tuple, like this:

class ExtendedProductAdmin(ProductAdmin):    inlines = ProductAdmin.inlines + [MyProductInline]

Or you will get this error:

    inlines = ProductAdmin.inlines + (MyProductInline,)TypeError: can only concatenate list (not "tuple") to list


Maybe use inheritance instead OneToOne relationship

class Product(models.Model):    name = models.CharField(max_length=100)    ...class MyProduct(Product):    .....

Or use proxy classes

class ProductProxy(Product)    class Meta:        proxy = True

in admin.py

class MyProductInlines(admin.StackedInline):    model = MyProductclass MyProductAdmin(admin.ModelAdmin):    inlines = [MyProductInlines]    def queryset(self, request):        qs = super(MyProductAdmin, self).queryset(request)        qs = qs.exclude(relatedNameForYourProduct__isnone=True)        return qsadmin.site.register(ProductProxy, MyProductAdmin)

In this variant your product will be in inline.


Referring to the last question, what would be the best solution for multiple sub-types. E.g class Product with sub-type class Book and sub-type class CD. The way shown here you would have to edit a product the general items plus the sub-type items for book AND the sub-type items for CD. So even if you only want to add a book you also get the fields for CD. If you add a sub-type e.g. DVD, you get three sub-type field groups, while you actually only want one sub-type group, in the mentioned example: books.