代码之家  ›  专栏  ›  技术社区  ›  Giovanni Di Milia

Django:重写RelatedFieldWidgetWrapper

  •  5
  • Giovanni Di Milia  · 技术社区  · 15 年前

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

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

    所以我写了我对这门课的理解,并改变了它 render 功能。

    但现在我该如何使用它呢?我的意思是…在我的模型定义中,我必须使用 formfield_overrides 这样?

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

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

    谢谢。

    2 回复  |  直到 12 年前
        1
  •  4
  •   Dmitry Shevchenko    15 年前

    您需要为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
    
        2
  •  1
  •   synthesizerpatel    12 年前

    我通过猴子修补小部件来处理这一点略有不同——这样,变化就反映在所有形式中,而您不必胡乱摆弄Django的源代码。

    我在做定制时遇到了这个问题 yawd admin 一个非常好的twitter引导皮肤管理界面。现在,我所有的图标都被放大了。

    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