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

我有一个自定义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小部件呈现。

回答:

django管理员对其许多字段使用自定义窗口小部件。覆盖字段的方法是创建一个供ModelAdmin对象使用的Form。

# 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)

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

以上是 Django Admin-覆盖自定义表单字段的小部件 的全部内容, 来源链接: utcz.com/qa/418902.html

回到顶部