Изменить раскрывающиеся ярлыки для Django UserAdmin - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть модель User с полем timezone:

class User(AbstractBaseUser, PermissionsMixin):
    timezone = models.CharField(
        max_length=64,
        choices=[(tz, tz) for tz in pytz.common_timezones],
        default="UTC",
    )

При просмотре в Django admin это создает раскрывающийся список часовых поясов, но только из имена. Я хотел бы динамически генерировать метки для этого раскрывающегося списка, которые добавляют смещение в качестве префикса (например, +02:00) и сортируют список по этому. Я знаю, что могу создать их, выполнив что-то вроде:

choices=[
    (tz, display_with_offset(tz))
    for tz in pytz.common_timezones
],

, где display_with_offset генерирует требуемую метку, но я думаю, что это вычислит ее только при выполнении миграций и будет игнорировать любые изменения перехода на летнее время, которые В некоторых регионах это происходит в течение года.

Мой админ-файл выглядит следующим образом:

class MyUserAdmin(UserAdmin):
    fieldsets = [
        ("Info", {"fields": ("timezone")}),
    ]

admin.site.register(models.User, MyUserAdmin)

Есть ли способ динамической установки выпадающих меток?

1 Ответ

1 голос
/ 09 апреля 2020

Вы можете создать ModelForm и переопределить выбор. Например:

class UserAdminForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
      super().__init__(*args, **kwargs)
      self.fields['timezone'].choices = [
          (tz, display_with_offset(tz)) for tz in pytz.common_timezones
      ]

    class Meta:
        model = User
        fields = '__all__'

class MyUserAdmin(UserAdmin):
    fieldsets = [
        ("Info", {"fields": ("timezone")}),
    ]
    form = UserAdminForm

Более подробную информацию можно найти в документации .

...