2011-04-20 52 views
6

我有多個管理站點,因此不同的用戶可以獲得編輯數據庫中對象的不同體驗。每個管理站點都有一組不同的對象公開,並有不同的樣式。所有這些都可以通過覆蓋模板和ModelAdmin對象來完成。如何覆蓋django的管理界面中的help_text

我無法解決如何通過不同的網站提供不同的help_text。 help_text總是直接從模型字段定義中獲取,並且似乎沒有辦法覆蓋它。

我錯過了什麼,或者這是不可能的?

回答

0

您可以隨時更改表單字段上的ModelAdmin構造屬性,是這樣的:

 
    def __init__(self, *args, **kwargs): 
     super(ClassName, self).__init__(*args, **kwargs) 
     if siteA: 
      help_text = "foo" 
     else: 
      help_text = "bar" 
     self.form.fields["field_name"].help_text = help_text 
+0

不,據我所看到的工作 - ModelAdmin.fields只是一個字符串列表:http://docs.djangoproject.com /en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.fields – Toby 2011-04-20 16:17:14

+0

糟糕!實際上,字段將通過ModelAdmin的表單屬性提供。另外,確保首先調用父構造函數。請參閱編輯。 – Carlos 2011-04-20 16:49:00

+0

仍然不適用於我: 「type object'ModelForm'has no attribute'fields'」 – Toby 2011-04-26 11:38:41

-1

試試這個(可能需要使用self.form.fields更換self.fields ...)

class PropertyForm(models.ModelAdmin): 
    class Meta: 
     model = Property 
    def __init__(self, *args, **kwargs): 
     super(PropertyForm, self).__init__(*args, **kwargs) 
     for (key, val) in self.fields.iteritems(): 
      self.fields[key].help_text = 'what_u_want' 
1

Cerin是對的,但他的代碼不能很好地工作(至少在Django 1.4中)。

def get_readonly_fields(self, request, obj): 
    try: 
     field = [f for f in obj._meta.fields if f.name == 'author'] 
     if len(field) > 0: 
      field = field[0] 
      field.help_text = 'some special help text' 
    except: 
     pass 
    return self.readonly_fields 

您必須更改「作者」和help_text字符串以適合您的需求。

12

您可以創建一個新的模型的形式和覆蓋那裏help_text:

class MyForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(MyForm, self).__init__(*args, **kwargs) 
     self.fields['myfield'].help_text = 'New help text!' 

然後使用新的形式在您的ModelAdmin:

class MyModel(admin.ModelAdmin): 
    ... 
    form = MyForm 

這是爲了實現你想要的清潔方式因爲表單域總是屬於表單!

+1

奇怪的是,這似乎不適用於'editable = False'字段。這些甚至不會出現在form.fields中...... – Cerin 2014-03-27 19:06:44

+0

Hello @Cerin,你是對的,只讀字段總是被排除在管理模型表單之外。他們不是隻讀/禁用表單輸入或類似的東西,它只是模型字段或方法的str repr。 – ppetrid 2014-03-27 19:15:32

4

在Django的1.9,類似於下面爲我工作

def get_form(self, request, obj=None, **kwargs): 
    form = super(MyAdmin, self).get_form(request, obj, **kwargs) 
    form.base_fields['my_field'].help_text = """ 
    Some helpful text 
    """ 
    return form 
+0

這是一個非常有用且快速的方法! – ihhcarus 2016-12-27 00:45:40