Search code examples
djangodjango-admindjango-contenttypes

How to add\get data in admin via reversed relation using GenericTabularInline?


I can add Criterias to a place. How can I add Places to a criteria?

Models:

class Criterias(models.Model):
    name = ...

class Places(models.Model):
    name = ...

class PlacesToCriterias(models.Model):
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey()

    criteria_group = models.ForeignKey(Criterias)

Admin - PLACES part:

class PlaceCriteriasInlineAdmin(GenericTabularInline):
    model = PlacesToCriterias

class PlacesAdmin(admin.ModelAdmin):
    inlines = [PlaceCriteriasInlineAdmin]

admin.site.register(Places, PlacesAdmin)

In this case, when I open Places admin change page, I can add Criterias items to my 'place'.

Admin - CRITERIAS part:

class CriteriaPlacesInlineAdmin(GenericTabularInline):
    model = PlacesToCriterias

class CriteriasAdmin(admin.ModelAdmin):
    inlines = [CriteriaPlacesInlineAdmin]

admin.site.register(Criterias, CriteriasAdmin)

In this case, when I open Criterias admin change page, I CAN NOT add Places item to my 'criteria', because instead of possible places I see criterias.

How to get Places items at Criterias admin page?


Solution

  • It was quite easy. GenericTabularInline must be changed to admin.TabularInline

    class CriteriaPlacesInlineAdmin(admin.TabularInline):
        model = PlacesToCriterias
    
    class CriteriasAdmin(admin.ModelAdmin):
        inlines = [CriteriaPlacesInlineAdmin]
    
    admin.site.register(Criterias, CriteriasAdmin)
    

    If anyone needs to get dropdown list with selected object, instead of content_type and object_id fields, the solution is here.