Python 更改Django UserAdmin的下拉标签
我有一个Python 更改Django UserAdmin的下拉标签,python,django,django-admin,Python,Django,Django Admin,我有一个用户模型,上面有一个时区字段: 类用户(AbstractBaseUser,PermissionsMixin): 时区=models.CharField( 最大长度=64, 选项=[(tz,tz)用于pytz.common_时区中的tz], default=“UTC”, ) 在Django admin中查看时,将创建一个时区下拉列表,但仅创建名称下拉列表。我希望为此下拉列表动态生成标签,将偏移量添加为前缀(例如,+02:00),并按此对列表进行排序。我知道我可以通过以下方式创建这些: 选
用户
模型,上面有一个时区
字段:
类用户(AbstractBaseUser,PermissionsMixin):
时区=models.CharField(
最大长度=64,
选项=[(tz,tz)用于pytz.common_时区中的tz],
default=“UTC”,
)
在Django admin中查看时,将创建一个时区下拉列表,但仅创建名称下拉列表。我希望为此下拉列表动态生成标签,将偏移量添加为前缀(例如,+02:00
),并按此对列表进行排序。我知道我可以通过以下方式创建这些:
选择=[
(tz,显示带有偏移量的(tz))
对于pytz.common_时区中的tz
],
其中,display_with_offset
生成所需的标签,但我认为这只会在运行迁移时进行计算,并且会忽略某些地区全年发生的任何夏时制更改
我的管理文件如下所示:
类MyUserAdmin(UserAdmin):
字段集=[
(“信息”、{“字段”:(“时区”)}),
]
admin.site.register(models.User、MyUserAdmin)
是否有一种方法可以动态设置下拉标签?您可以创建模型表单并覆盖选项。例如:
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
更多信息可在图例中找到。Legend。非常感谢。另外,正如提示一样,您的答案中也有一些输入错误(在
super()\uuuuu init\uuuu(…)
行和后面有一个冒号,选项是
而不是。选项是
。请注意,您不需要在\uuu init\uuuuu()中输入这些内容
method,choices
可以在定义表单字段时调用。因此,您还可以定义timezone=forms.ChoiceField(choices=timezone\u choices)
以覆盖表单中的timezone
选项,其中timezone\u choices
是一个返回选项列表的函数。