Python 3.x Django:如何在管理视图中为readonly_字段设置默认随机值?

Python 3.x Django:如何在管理视图中为readonly_字段设置默认随机值?,python-3.x,django,Python 3.x,Django,在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

在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”设置为只读字段

#admin.py
@admin.register(Project)
class ProjectAdmin(admin.ModelAdmin):
    fields = ('name', 'code')
    readonly_fields = ('code', )
当我在管理页面中创建一个新的项目对象时,问题就出现了。“code”的默认值会出现(例如ABCD),但当我保存数据时,该值会更改为另一个值(例如EFGH)。我认为创建了两个对象:一个是加载页面时,另一个是保存数据时


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

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

def generate_ref_code():
    code = str(uuid.uuid4()).replace("-","")[:12]
    return code
 def save(self, *args, **kwargs):
        code = str(uuid.uuid4()).replace("-","")[:12]
        self.code = code
        super(Project, self).save(*args, **kwargs)
然后将此函数放入项目类模型中:

 def save(self, *args, **kwargs):
        if self.code == "":
            code = generate_ref_code()
            self.code = code
        super().save(*args, **kwargs)
或者更简单的实现如下所示:

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

别忘了将代码字段设置为blank='true',这样您就可以保存一个空白代码,并将随机生成一个代码到您的字段中

在这种情况下,管理页面中“Code”的初始值将为空,并且只有在我保存对象时才会设置随机值。在保存之前,我想在“admin/project/add”页面中查看“code”字段的随机值。这是可能的吗?你是对的,在这种情况下,你在保存之前看不到你的代码,要解决这个问题,你可以使用pre_save signal。这应该可以解决你的问题,这是一个链接,可以帮助你相信,在加载管理页面中的表单时,pre_save signal不会出现。我可以使用pre_save覆盖“code”变量,但如何保存“ABCD”值(添加页面中“code”的初始值)以用于pre_save?