【问题标题】:Django: override RelatedFieldWidgetWrapperDjango:覆盖 RelatedFieldWidgetWrapper
【发布时间】:2011-01-10 11:49:11
【问题描述】:

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

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

所以我编写了这个类的我的版本并更改了它的render 函数。

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

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

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

非常感谢。

【问题讨论】:

    标签: django django-admin django-forms


    【解决方案1】:

    您需要为 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】:

    我通过猴子修补小部件的方式略有不同 - 这样更改会反映在所有形式中,并且您不会在 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
    

    【讨论】:

    • 很高兴你喜欢 yawd-admin!我们现在正在为 yawd-admin 中的相关字段创建自定义小部件(使用 select2 选择框),因此我们可以像您一样使用引导图标。
    猜你喜欢
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    • 2016-03-20
    • 2011-08-17
    • 2017-02-26
    • 2014-06-09
    相关资源
    最近更新 更多