2009-06-15 66 views
1

對於聽起來很容易的事,即時通訊有一些問題尋找答案。我有這樣的模式:Django:只顯示管理員中的表單的文本

class Page(models.Model): 
    creator  = models.TextField(blank=False) 
    name   = models.CharField(max_length=70, primary_key=True) 
    name_slug  = models.SlugField(max_length=70, unique=True) 

每當我在管理IM保存做一個預保存操作(save_model()),其通過名稱+創造者的重擊值(例如:i_am_legend_cyber_valdez)到name_slug,我想do是完全在admin文本中使name_slug文本框完全不用管理員模板。這可能嗎?

+1

我不確定您的意思是「純文字」。你想讓它顯示它,但你不能編輯name_slug的值嗎? – bchang 2009-06-15 23:25:16

+0

兩種情況都應該正常工作,但是,如果可能的話,我也喜歡純文本替代 – cybervaldez 2009-06-19 15:51:47

回答

2

無論是在您的ModelAdmin.formfield_overrides或ModelAdmin.formfield_for_dbfield中,還是在自定義的ModelForm中,都需要爲name_slug字段指定一個自定義小部件,該字段僅顯示字段的值,而不顯示HTML表單輸入。你可以找到這樣一個小部件here

編輯:我不會深入瞭解創建自定義小部件的細節,因爲您可以使用上面鏈接的那個。爲了讓這個小工具爲所有SlugField的模型中,最簡單的方法是使用formfield_overrides

class PageAdmin(admin.ModelAdmin): 
    formfield_overrides = { 
     models.SlugField: {'widget': ReadOnlyWidget}, 
    } 

如果你在你的模型中的多個SlugFields,只希望將ReadOnlyWidget應用到其中的一個,你會重寫該formfield_for_dbfield方法:

class PageAdmin(admin.ModelAdmin): 
    def formfield_for_dbfield(self, db_field, **kwargs): 
     if db_field.name == 'name_slug': 
      kwargs['widget'] = ReadOnlyWidget 
     return super(PageAdmin, self).formfield_for_dbfield(db_field, **kwargs) 

您也可以爲您的模型完全定製的ModelForm並將其分配給您的ModelAdmin的形式屬性,但除非你做更深層次的定製是沒有必要的。

相關問題