Django:如何在管理视图中为 readonly_field 设置默认随机值?

Posted

技术标签:

【中文标题】Django:如何在管理视图中为 readonly_field 设置默认随机值?【英文标题】:Django: how set default random value for readonly_field in admin view? 【发布时间】:2021-08-16 01:20:56 【问题描述】:

在 django 项目中,我创建了一个名为“create_code”的默认函数来随机为 models.py 文件中的“code”字段生成一个默认值。

# models.py
class Project(models.Model):
    name = models.CharField("Project name", max_length=255)
    code = models.CharField("Code", max_length=10, default=create_code, editable=False)

在 admin.py 文件中,我将“code”设置为 readonly_field。

#admin.py
@admin.register(Project)
class ProjectAdmin(admin.ModelAdmin):
    fields = ('name', 'code')
    readonly_fields = ('code', )

当我在管理页面中创建一个新的项目对象时会出现问题。出现“代码”的默认值(例如 ABCD),但是当我保存数据时,此值会更改为另一个值(例如 EFGH)。我认为创建了两个对象:一个在加载页面时创建,另一个在保存数据时创建。

如何从第一个对象读取“代码”值以覆盖最后一个对象并保存“ABCD”而不是“EFGH”?

【问题讨论】:

【参考方案1】:

如果您只想在创建对象时创建一个随机代码,更好的方法是在您的模型中使用此函数,这可以解决您的问题: 首先创建一个方法来生成这样的随机数:

def generate_ref_code():
    code = str(uuid.uuid4()).replace("-","")[:12]
    return code

然后将此函数放入您的项目类模型中:

 def save(self, *args, **kwargs):
        if self.code == "":
            code = generate_ref_code()
            self.code = code
        super().save(*args, **kwargs)

或者更简单的实现是这样的:

 def save(self, *args, **kwargs):
        code = str(uuid.uuid4()).replace("-","")[:12]
        self.code = code
        super(Project, self).save(*args, **kwargs)

并且不要忘记在您的代码字段中设置空白='true',这样您就可以保存一个空白代码,这会随机生成一个代码到您的字段

【讨论】:

在这种情况下,管理页面中“code”的初始值为空白,只有在我保存对象时才会设置随机值。我想在保存之前查看“代码”字段的“管理员/项目/添加”页面中的随机值。这可能吗? 你是对的,在这种情况下你在保存之前看不到你的代码,要解决这个问题,你可以使用 pre_save 信号。这应该可以解决你的问题,这是可以帮助你的链接***.com/questions/6461989/… 我相信加载管理页面中的表单时不会发出 pre_save 信号。我可以使用 pre_save 覆盖“code”变量,但是如何保存“ABCD”值(添加页面中“code”的初始值)以在 pre_save 中使用?

以上是关于Django:如何在管理视图中为 readonly_field 设置默认随机值?的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 中为特定视图设置用户权限

如何在(Django GeoIP)中为每个国家/地区显示广告

永远不会调用Django管理界面中的字段的只读方法

如何在 Django 管理员中为模型字段使用自定义表单字段?

我应该如何在 Django 中为表单编写测试?

Django admin - 如何在自定义管理表单中为多对多字段添加绿色加号