Пользовательское нисходящее и восходящее поле администратора Django

Я использую Django Admin для визуализации и редактирования данных моей модели. Одним из полей модели является дата и, к сожалению, это CharField, но с валидатором ( dd.mm.yyyy ). Я пытаюсь найти решение для правильной сортировки этих дат, когда администратор нажимает кнопку сортировки, которая по умолчанию используется в django. По моему опыту работы с Java, все дело было в перезаписи функции сравнения класса.

data_de_montat = models.CharField(help_text="eg: 02.07.2020 or 12.9.2021", max_length=15, validators=[
    RegexValidator(r'^[0-9]{1,2}.[0-9]{1,2}.[0-9]{4}$',
                   message='It should be dd.ll.aaaa',
                   code='wrong format'
                   )])

кнопка


person learner123    schedule 10.09.2020    source источник


Ответы (2)


В джанго это очень просто. Вам нужно только войти в admin.py, чтобы создать класс с именем вашей модели, а затем добавить фильтр по дате создания, который автоматически сортирует все даты для вас. Пример:

Шаг 1. Перейдите в admin.py вашего приложения.

Шаг 2: Добавьте следующий код

class YourModelAdmin(admin.ModelAdmin):
list_filter=['data_de_montat']
person Flash Maddy    schedule 10.09.2020
comment
Это не совсем то, что я хочу, это не фитинг, а их порядок отображения. - person learner123; 10.09.2020

Мне удалось решить эту проблему, добавив еще 3 вычисляемых поля, используя аннотацию и комбинации Функции базы данных для форматирования моих данных. Это не то решение, о котором я мечтал, но я каким-то образом справился с этим. Этот код входит в модель администратора.

    def get_queryset(self, request):
        qs = super(ProgramareAdmin, self).get_queryset(request)
        qs = qs.annotate(day=Cast(str("data_de_montat").split(".")[0], output_field=IntegerField()),
                         month=Cast(Substr("data_de_montat", StrIndex("data_de_montat", V('.')) + 1),
                                   output_field=IntegerField()),
                         year=Cast(Right("data_de_montat", 4), output_field=IntegerField()))
        return qs

    def day(self, obj):
        return obj.day

    def month(self, obj):
        return obj.month

    def year(self, obj):
        return obj.year

    day.admin_order_field = 'day'  # sortable new column
    month.admin_order_field = 'month'  # sortable new column
    year.admin_order_field = 'year'  # sortable new column

Это работает только для даты, используя формат типа dd.mm.yyyy или d.m.yyyy и любую их комбинацию.

Не стесняйтесь отвечать с лучшим решением или улучшениями для этого метода.

person learner123    schedule 10.09.2020