2014-10-29 75 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