KenanBek
KenanBek

Reputation: 1067

How to show related objects in Django/Admin?

I have 2 models:

from django.db import models

class Category(models.Model):
    icon = models.ImageField(upload_to = 'thing/icon/')
    image = models.ImageField(upload_to = 'thing/image/')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    title = models.CharField(max_length=200)
    slug = models.SlugField()
    desc = models.TextField(max_length=1000)

    def __str__(self):
        return self.title

    def __unicode__(self):
        return self.title

class Thing(models.Model):
    icon = models.ImageField(upload_to = 'thing/icon/')
    image = models.ImageField(upload_to = 'thing/image/')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    title = models.CharField(max_length=200)
    slug = models.SlugField()
    desc = models.TextField(max_length=1000)
    content = models.TextField()
    category = models.ForeignKey('Category')

    def __str__(self):
        return self.title

    def __unicode__(self):
        return self.title

I am using Django's admin site for basic CRUD operations. I need to show all Things in Category if I am selecting an Category in admin.

Upvotes: 32

Views: 34095

Answers (3)

R.R.C.
R.R.C.

Reputation: 6711

Few minutes ago, searching how to solve a similar problem, I finally found a solution.

You actually have to follow @Matteo Scotuzzi answer as well, then

Inside admin.py located in the app your created those models, you have to declare as follows right bellow @Matteo snippet:

admin.site.register(Category, CategoryAdmin)

and that would be enough to make all "Things" appear in "Category" inside your Django Administration respective page which is "Category".

Upvotes: 4

Shivam Agrawal
Shivam Agrawal

Reputation: 861

update admin.py file like this.

from django.contrib import admin
from .views import Category, Thing

class CategoryAdmin(admin.ModelAdmin):
    inlines = [
        ThingInline,
    ]

class ThingInline(admin.TabularInline):
    model = Thing

admin.site.register(Category, CategoryAdmin) 
admin.site.register(Thing)

There are two inline options TabularInline and StackedInline

Upvotes: 11

Matteo Scotuzzi
Matteo Scotuzzi

Reputation: 876

You can use "Inlines" to visualize and edit Things of a certain Category in the admin detail for that category:

In the admin.py file, create an Inline object for Thing (ThingInline) and modify your CategoryAdmin class to have an inline of type ThingInline like this:

...
class ThingInline(admin.TabularInline):
    model = Thing

class CategoryAdmin(admin.ModelAdmin):
    inlines = [
        ThingInline,
    ]
...

For further details, this is the docs for admin inlines: https://docs.djangoproject.com/en/dev/ref/contrib/admin/#inlinemodeladmin-objects

Upvotes: 51

Related Questions