Django Admin: OneToOne Relation as an Inline?

django, django-admin, one-to-one, python, python-3.x

Solution

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 ProductAdmin

class MyProductInline(admin.StackedInline):
    model = MyProduct

class 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

Problem

I'm putting together the admin for a satchmo application. Satchmo uses OneToOne relations to extend the base `Product` model, and I'd like to edit it all on one page. Is it possible to have a OneToOne relation as an Inline? If not, what is the best way to add a few fields to a given page of my admin that will eventually be saved into the OneToOne relation? for example: ``` class Product(models.Model): name = models.CharField(max_length=100) ... class MyProduct(models.Model): product = models.OneToOne(Product) ... ``` I tried this for my admin but it does not work, and seems to expect a Foreign Key: ``` class ProductInline(admin.StackedInline): model = Product fields = ('name',) class MyProductAdmin(admin.ModelAdmin): inlines = (AlbumProductInline,) admin.site.register(MyProduct, MyProductAdmin) ``` Which throws this error: `<class 'satchmo.product.models.Product'> has no ForeignKey to <class 'my_app.models.MyProduct'>` Is the only way to do this a Custom Form? edit: Just tried the following code to add the fields directly... also does not work: ``` class AlbumAdmin(admin.ModelAdmin): fields = ('product__name',) ```

Original source