2014-10-29 43 views
0

我有以下型号定义:Django管理默认随机ID更改之前保存

def _createHashID(): 
    return uuid.uuid4().hex[:8] # 8 chars OK for < 100k items 
class Act(models.Model): 
    hashid = models.CharField(
    'hashid', 
    max_length=20, 
    default=_createHashID, 
    unique=True, 
    primary_key=True, 
    help_text="technical identifier") 

然而,当我使用管理网站,以便创建Act项目,如果hashid值是只读的,产生价值一次生成表单时,在保存Act对象时重新生成值。这意味着Add an Act页面将首先出现的标识符,说583a95de,但我们我打救,它会告诉我:

The act "0b8c2832" was added successfully. 

如果如果删除admin.ModelAdmin对象的readonly属性,则hashid处于输入(I显然不希望那样),但建议的值如果是真实的hashid的新对象。

第一次实例化对象(创建表单)时,如何生成只读hashid并确保它确实是保存时使用的对象?

超出这个问题的是我不能使用内联formset,因为pk在保存时间被改变!

回答

1

您可以覆盖与此答案类似的表单上的admin和只读值。 https://stackoverflow.com/a/325038/1637351

Docs about admin's form。

按照该文档你设置它像这样:

class ActAdmin(admin.ModelAdmin): 
    form = ActForm 
+0

感谢蒂姆这个很好的答案,可以工作。然而,这将允许用户选择哈希值,因为我们无法控制它没有被修改,就像你链接的问题一样。你有一个想法如何防止? – Zack4 2014-10-30 19:00:07

+0

简而言之,你将无法做到。该值未存储在服务器上。它只会存在于客户端。你也可以有一个隐藏的领域,你可以比较它,但也可以改变。 – schillingt 2014-10-30 19:45:11