我有一個表用來儲存輪播圖片,有一個 `picture` 字段儲存的是圖片的url,圖片的 url 通過上傳文件到 cdn 獲得。目前這個表的編輯是通過自定義一個 `ModelForm`,然后重寫 Django admin 邏輯將文件上傳到 cdn 獲取地址后,儲存到數據庫。
# 自定義表單
class PuzzleImgForm(forms.ModelForm):
picture = forms.FileField(label='圖片', required=False)
# 覆蓋 Django admin 代碼
def get_form(self, request, obj=None, **kwargs):
return PuzzleImgForm
# 數據表只儲存圖片鏈接
picture = models.CharField("圖片url", max_length=2048, null=True, blank=True)
現在,遇到一個問題,修改圖片的時候看不到圖片的樣子,只能看到 url,不夠直觀。於是我就搜索 `django admin form show image`。發現一個答案比較簡潔,嘗試並修改了部分,成功了。
def image_img(self):
if self.image:
return marksafe('<img src="%s" />' % self.image_url)
else:
return '(no image)'
image_img.short_description = 'Thumb'
# and in your admin.py add:
list_display= ('image_img','product',)
readonly_fields = ('image_img',)
#and for adding it in the 'Edit mode' of your admin panel in your admin.py add:
fields = ( 'image_img', )
我這里的問題是,使用 fields 會覆蓋自定義的表單,admin 頁面上只出現一個 image_img 字段。如果刪除 fields,將 `image_img` 加入 `ist_display`,那么 `image_img` 不會出現。最后我將其放入 `readonly_fields` 才生效。
我的思考
關於重寫 Django admin
能使用大部分 Django 已有的功能,只需要重寫少部分排版與篩選。覆蓋 Django 源碼可能會很麻煩。
關於Django 用法
`list_display` 與 `fields` 有什么區別?
關於向下兼容與重構
我們寫代碼的時候,看到之前的代碼,想的更多是重構掉,而不是向下兼容,因為往往之前的代碼存在各種問題,保持繼續兼容反而會更難受。比如 python2 的編碼問題,python3 就徹底不同,從 ASCII 改為 UNICODE。我認為,保持兼容是要之前的代碼立意、邏輯正確,才有意義。但是,一開始寫代碼,一些情況、需求往往和之后的會不一樣,這種情況要怎么處理?
