Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 更改Django UserAdmin的下拉标签_Python_Django_Django Admin - Fatal编程技术网

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
是一个返回选项列表的函数。