Django Admin - 覆盖自定义表单字段的小部件

2024-03-06

我有一个自定义 TagField 表单字段。

class TagField(forms.CharField):
    def __init__(self, *args, **kwargs):
        super(TagField, self).__init__(*args, **kwargs)
        self.widget = forms.TextInput(attrs={'class':'tag_field'})

如上所示,它使用 TextInput 表单字段小部件。但在管理中我希望它使用 Textarea 小部件显示。为此,有formfield_overrides钩子,但它不适用于这种情况。

管理员声明是:

class ProductAdmin(admin.ModelAdmin):
    ...
    formfield_overrides = {
        TagField: {'widget': admin.widgets.AdminTextareaWidget},
    }

这对表单字段小部件没有影响,并且tags仍然使用 TextInput 小部件呈现。

任何帮助深表感谢。

--
omat


django 管理员在其许多字段中使用自定义小部件。覆盖字段的方法是创建一个与 ModelAdmin 对象一起使用的表单。

# forms.py

from django import forms
from django.contrib import admin

class ProductAdminForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(ProductAdminForm, self).__init__(*args, **kwargs)
        self.fields['tags'].widget = admin.widgets.AdminTextareaWidget()

然后,在 ModelAdmin 对象中指定以下形式:

from django.contrib import admin
from models import Product
from forms import ProductAdminForm

class ProductAdmin(admin.ModelAdmin):
    form = ProductAdminForm

admin.site.register(Product, ProductAdmin)

此时您还可以覆盖查询集:例如,根据模型中的另一个字段过滤对象(因为limit_choices_to无法处理这个)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django Admin - 覆盖自定义表单字段的小部件 的相关文章

随机推荐