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

    @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
    Ответ написан
    Комментировать
  • Как получить в админке данные через обратную связь при использовании GenericTabularInline?

    @TitanFighter Автор вопроса
    Все оказалось очень просто - нужно было вместо GenericTabularInline использовать admin.TabularInline

    class CriteriaPlacesInlineAdmin(admin.TabularInline):
        model = PlacesToCriterias
    
    class CriteriasAdmin(admin.ModelAdmin):
        inlines = [CriteriaPlacesInlineAdmin]
    
    admin.site.register(Criterias, CriteriasAdmin)
    Ответ написан
    Комментировать
  • ModelChoiceField\label_from_instance или как сделать Choices используя данные 2х моделей для вывода стран в профиле пользователя?

    @TitanFighter Автор вопроса
    Решение проблемы

    class CountriesChoiceField(forms.ModelChoiceField):
        def __init__(self, user_lang, *args, **kwargs):
            queryset = Countries.objects.filter(
                status=1, iso3166_1__isnull=False,
                countriestranslations__lang_group=user_lang).order_by('countriestranslations__common_name')
    
            super(CountriesChoiceField, self).__init__(queryset, *args, **kwargs)
    
            self.translations = OrderedDict()
            for country in queryset:
                name = country.countriestranslations_set.get(lang_group=user_lang).common_name
                self.translations[country] = name
    
        def label_from_instance(self, obj):
            return self.translations[obj]
    
    class UserProfileForm(forms.ModelForm):
        user_lang = user_lang_here
        country = CountriesChoiceField(widget=forms.Select(), user_lang=user_lang)
    
        class Meta:
            model = UserProfile()
            fields = ('email', 'email_privacy',
                      'profile_url',
                      'first_name', 'last_name',
                      'country',)

    В итоге имеем 7 queries in 29.45ms против 73 queries in 92.52ms
    Ответ написан
    Комментировать
  • Использовать ли django.contrib.gis.db.backends.postgis для всего проекта?

    @TitanFighter
    Встала похожая задача. Почитав все что можно, ответа не нашел. Решил сам проверить, как оно будет с одной базой.

    1. Под гео данные сделал отдельное приложение app_geo.
    2. В инете нашел, что django.contrib.gis.db.models наследуется от django.db.models, по этому в этом апп-е в models.py прописал
    from django.contrib.gis.db import models

    В моделях других приложений оставил старый вариант
    from django.db import models

    3. Поменял в settings.py движок, как указано в шапке.

    После миграции в базу добавились парочка новых таблиц из app_geo.
    В итоге все работает нормально.
    Ответ написан
    Комментировать