2010-01-28 74 views
3

我想更改显示管理站点中外键的“+”图标的方式。Django:覆盖RelatedFieldWidgetWrapper

我发现打印代码的小部件是RelatedFieldWidgetWrapper,它在django/contrib/admin/widgets.py中。

所以我写了我的这个类的版本,我改变了它的render函数。

但现在我该如何使用它?我的意思是......在我的模型的定义中,我是否必须以这种方式使用formfield_overrides

formfield_overrides = { 
     models.ForeignKey: {'widget': customRelatedFieldWidgetWrapper}, 
} 

我认为这是不正确的做法,因为小部件是不是管理整个外键的一个,但只有“+​​”图标。 我错了吗?

非常感谢。

回答

2

您需要为ModelAdmin创建自定义ModelForm并在其中覆盖小部件。

示例代码:

#forms.py 
class CustomForm(forms.ModelForm): 
    user = forms.ModelChoiceField(queryset=User.objects.all(), widget=yourCustomWidget) 

class Meta: 
    model = MyModel 

#admin.py 
class MyModelAdmin(admin.ModelAdmin): 
    form = CustomForm 
+0

你能写一个例子吗? – 2010-01-28 21:21:47

+0

编辑我的答案 – 2010-01-28 22:21:20

1

我走近这个略有不同的猴子修补部件 - 这样的变化反映在所有形式和你不Django的源代码胡闹左右。

我遇到了这个问题,因为我正在定制yawd admin,这是一个非常好的管理界面Twitter-Bootstrap外观。现在我所有的图标都变得沸腾起来了。

import django.contrib.admin.widgets 

class MyRelatedFieldWidgetWrapper(django.contrib.admin.widgets.RelatedFieldWidgetWrapper): 
    """ 
    This class is a wrapper to a given widget to add the add icon for the 
    admin interface. 
    """ 
    def render(self, name, value, *args, **kwargs): 
     rel_to = self.rel.to 
     info = (rel_to._meta.app_label, rel_to._meta.model_name) 
     self.widget.choices = self.choices 
     output = [self.widget.render(name, value, *args, **kwargs)] 
     if self.can_add_related: 
      related_url = reverse(
       'admin:%s_%s_add' 
       % info, current_app=self.admin_site.name 
      ) 
      output.append(
      """ 
      <a href="%s" 
       onclick="return showAddAnotherPopup(this); 
       alt="%s"> 

       <i class="help icon-large icon-plus-sign" 
        id="add_id_%s" 
        data-original-title> 
       </i> 
      </a>""" % (related_url, _('Add Another'), name)) 
      return mark_safe(''.join(output)) 

# Monkeypatch it 
django.contrib.admin.widgets.RelatedFieldWidgetWrapper = MyRelatedFieldWidgetWrapper 
+1

很高兴你喜欢yawd-admin!我们正在为yawd-admin中的相关字段创建一个自定义窗口小部件(使用select2选择框),所以我们可以像使用bootstrap图标一样使用它。 – ppetrid 2013-03-08 00:43:21