Generic Relations/Generic Foreign Keys in the Django Admin
Asked Answered
F

1

8

I've been trying to display a GenericForeignKey in the Django admin but can't get it working. I have a FullCitation class that can be linked to either a NonSupportedProgram or a SupportedProgram class. So, I have used a generic foreign key.

In the admin, I want users to only be able to select 'NonSupportedProgram' or 'SupportedProgram' from the content_type dropdown and then, from the object_id field, I need users to be able to select from a dropdown listing the existing NonSuportedPrograms or the existing SupportedPrograms, with the option of creating a new one. Is this possible? Where am I going wrong?

models.py

class FullCitation(models.Model)
    # the software to which this citation belongs
    # either a supported software program or a non-supported software program

    limit = models.Q(app_label = 'myprograms', model = 'supportedprogram') | models.Q(app_label = 'myprograms', model = 'nonsupportedprogram') 
    content_type = models.ForeignKey(ContentType), limit_choices_to = limit, )
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')

    is_primary = models.BooleanField(help_text="Is this the Primary Citation for the software program?")
    class Meta:
        unique_together = ('content_type', 'object_id')
        app_label = 'myprograms'

reversion.register(FullCitation)

class NonSupportedProgram(models.Model):
    title = models.CharField(max_length=256, blank = True)
    full_citation = generic.GenericRelation('FullCitation')

    class Meta:
        app_label = 'myprograms'
reversion.register(NonSBGridProgram)

class SupportedProgram(models.Model):
    title = models.CharField(max_length=256, blank = True)
    full_citation = generic.GenericRelation('FullCitation')
    # and a bunch of other fields.....

admin.py

class FullCitationAdmin(reversion.VersionAdmin):
    fieldsets = (
    ('Which Program', { 
        'fields': ('content_type', 'object_id', ),
    }),
    ('Citation Information', {
        'fields': ('is_primary',),
    }),)
# autocomplete_lookup_fields = {
#     'generic': [['content_type', 'object_id']],
#     } 

# inlines = ['NonSupportedProgramInline', ]

list_display = ('content_object', 'is_primary',)
search_fields = ('content_object__title', )
# list_filter = ('content_object',)
Folderol answered 3/2, 2015 at 21:20 Comment(2)
Did you ever fix this?Rosannarosanne
No, never figured it out. Had to stop this approach and do something completely different. Not exactly what I wanted, but oh well.Folderol
M
1

This is a module that renders GenericForeignKeys in the Django Admin:

https://github.com/lexich/genericrelationview

It just doesn't work with a no conflict jQuery setup (like the one from Django CMS).

Machiavellian answered 2/5, 2016 at 10:32 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.