【问题标题】:Django: how set default random value for readonly_field in admin view?Django:如何在管理视图中为 readonly_field 设置默认随机值?
【发布时间】: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”?

【问题讨论】:

    标签: python-3.x django


    【解决方案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 信号。这应该可以解决你的问题,这是可以帮助你的链接stackoverflow.com/questions/6461989/…
    • 我相信加载管理页面中的表单时不会发出 pre_save 信号。我可以使用 pre_save 覆盖“code”变量,但是如何保存“ABCD”值(添加页面中“code”的初始值)以在 pre_save 中使用?
    猜你喜欢
    • 1970-01-01
    • 2015-06-14
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 2012-10-15
    • 1970-01-01
    相关资源
    最近更新 更多