2011-04-20 117 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