@TitanFighter

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

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

Модели:
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)


Я могу добавить форму к inline CriteriaPlacesInlineAdmin:
class CriteriaPlacesChoicesFieldForm(forms.ModelForm):
    places = forms.ModelChoiceField(PlaceTypesGroups.objects.all(), label='place')

но как в данном случае передать content_type и object_id в эту форму, чтоб получить выпадающий список со всеми "Местами" и с выбранным текущим местом на основе content_type и object_id?
  • Вопрос задан
  • 230 просмотров
Решения вопроса 1
@TitanFighter Автор вопроса
Решение найдено.

Добавить форму в `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
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы