2015-06-28 48 views
0

我正在研究一些django應用程序,其中模型包含TextFieldPositiveIntegerFielddjango以編程方式將值分配給positiveIntegerField

我需要PositiveInegerField與在TextField的單詞數來填充。

這可以通過自定義JavaScript代碼來完成,該代碼計算TextField文本區域中單詞的數量,並在提交表單之前將該值賦給單詞計數字段文本框,但我不想在自定義JavaScript中使用管理員。

如何分配一個值到PositiveIntegerField編程?

+0

什麼是你真正想幹什麼?顯示用戶輸入的單詞數量?如果您之後需要單詞計數,爲什麼要單獨存儲而不是從文本中計算它? – jonrsharpe

+0

我需要存儲單詞的數量以在管理中的列表頁面中顯示它。這就是我所需要的,所以,我創建了另一個字段(word_count),它應該在保存模型對象之前填充。 – Fanooos

+0

爲什麼不使用屬性,而是存儲額外的字段? – jonrsharpe

回答

3

這可以使用pre_save Signal來實現。

創建一個信號功能是這樣的:

def calculate_wordcount(sender, instance, **kwargs): 
    # count the words... 
    instance.word_count = # your count from line above 

那麼這個功能附加到你的模型。自Django 1.7以來的首選方式是應用程序配置(請參閱doc)。

您可以將您的功能在AppConfig就緒() - 方法

def ready(self): 
    pre_save.connect(calculate_wordcount, 
        sender= ,# your model 
        weak=False, 
        dispatch_uid='models.your_model.wordcount') 

我會留下所有必要的進口增長給你們,請發表評論,如果您還需要進一步的方向!

1

雖然總的來說,我認爲保存信號是一個合理的想法,在這種特殊情況下,你也可以覆蓋.save()自己

class MyClass(models.Model): 

    [stuff] 

    def save(self, *args, **kwargs): 
     self.wordcount = #something that calculates wordcount 
     super(self.myClass, self).save(*args, **kwargs) #Call django's save! 

(作爲一個經驗法則,我會如果覆蓋save()我「M只是在做事情的一個模型,但使用一個信號,如果我用一個模型來影響另一個。我們的想法是,以保持影響的代碼在它附近一個模型中的所有東西,但這個進入的個人哲學)

還警告:不管你使用的版本,信號或覆蓋save()bulk_create一nd bulk_delete將不會發送信號或致電您的具體save功能。在這裏看到的文檔:https://docs.djangoproject.com/en/1.8/topics/db/models/#overriding-predefined-model-methods

+0

用於警告。讓我補充一點,有一些與夾具警告以及,請參閱[本文](http://stackoverflow.com/questions/3499791/how-do-i-prevent-fixtures-from-conflicting-with-django-post-保存信號代碼)。我個人不會*觸及'save()',除非我絕對必須,但我認爲這是個人偏好... – Mischback

相關問題