Как заменить поля content_type и object_id полем с реальным объектом в админ-инлайн?

У меня есть встроенный, который показывает данные contenttype модель, поэтому вместо реальных объектов я вижу content_type а также object_id поля. Я могу exclude эти поля - это не проблема, но я также хочу получить реальный объект, как selected с другим Places в раскрывающемся списке. Кто-нибудь может сказать мне, как я могу это сделать?

Модель:

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)

Администратор:

class CriteriaPlacesInlineAdmin(admin.TabularInline):
    model = PlacesToCriterias

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

admin.site.register(Criterias, CriteriasAdmin)

Я могу добавить к CriteriaPlacesInlineAdmin form, что-то вроде:

class CriteriaPlacesChoicesFieldForm(forms.ModelForm):
    places = forms.ModelChoiceField(PlaceTypesGroups.objects.all(), label='place')

но как мне пройти \ добавить object_id в эту форму \ запрос, чтобы получить "выбранное" место в выпадающем списке?

1 ответ

Решение

Нашел решение.

Добавить форму к admin.TabularInline:

class CriteriaPlacesInlineAdmin(admin.TabularInline):
    model = PlacesToCriterias
    form = CriteriaPlacesChoicesFieldForm  # <- ADDED FORM

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

admin.site.register(Criterias, CriteriasAdmin)

Форма:

class CriteriaPlacesChoicesFieldForm(forms.ModelForm):
    ct_place_type = ContentType.objects.get_for_model(PlaceTypesGroups)

    object_id = forms.ModelChoiceField(PlaceTypesGroups.objects.all(), label='places')
    content_type = forms.ModelChoiceField(ContentType.objects.all(), initial=ct_place_type, widget=forms.HiddenInput())

    def clean_object_id(self):
        return self.cleaned_data['object_id'].pk

    def clean_content_type(self):
        return self.ct_place_type
Другие вопросы по тегам