2012-05-09 101 views
0

如果我的問題已經被問到,但我找不到我正在尋找的答案。Django管理員 - 設置一個字段,當另一個進入

我用ImageFieldDateField創建了一個Model。在我的django自動管理(django 1.4)中,我有相應的ModelAdmin:我想在用戶填充ImageField時從圖像中設置日期。總結一下,當我選擇ImageField時,例如通過重寫一種選擇後的方法,我希望得到這個牌。

我該怎麼做?我可以在django文檔中看到clean方法存在,但是它的調用方式/時間對我來說還不清楚。

感謝您的幫助!

回答

0

您可以覆蓋模型的save()方法或更好地使用pre_savesignal。在裏面你可以檢查對象是否有圖像但沒有日期,並將日期設置爲datetime.datetime.now()

+0

感謝您的回答。我希望在輸入'ImageField'時調用更多,在保存之前這麼多,是否有信號或者可以使用? – Emmanuel

+0

你的意思是 - 在上傳到服務器之前?您可以使用JS然後用當前時間戳填充隱藏字段。 – ilvar

+0

我意識到我的請求很愚蠢(或者至少是複雜的,因爲圖像確實沒有上傳)。所以我決定重寫'save'方法。 – Emmanuel

0

看看從Django的文件服務器上的圖像模型:
https://github.com/stefanfoulis/django-filer/blob/develop/filer/models/imagemodels.py

你可以做的保存方法類似。

def save(self, *args, **kwargs): 
    if self.date_taken is None: 
     try: 
      exif_date = self.exif.get('DateTimeOriginal', None) 
      if exif_date is not None: 
       d, t = str.split(exif_date.values) 
       year, month, day = d.split(':') 
       hour, minute, second = t.split(':') 
       self.date_taken = datetime(
            int(year), int(month), int(day), 
            int(hour), int(minute), int(second)) 
     except: 
      pass 
    if self.date_taken is None: 
     self.date_taken = datetime.now() 
    self.has_all_mandatory_data = self._check_validity() 
    try: 
     # do this more efficient somehow? 
     self.file.seek(0) 
     self._width, self._height = PILImage.open(self.file).size 
    except Exception: 
     # probably the image is missing. nevermind. 
     pass 
    super(Image, self).save(*args, **kwargs) 
+0

感謝你的回答,正如ilvar的回答之後所解釋的那樣,我希望在輸入'ImageField'時調用更多。 – Emmanuel

相關問題