Django Admin-覆盖自定义表单字段的小部件
我有一个自定义标记字段表单字段Django Admin-覆盖自定义表单字段的小部件,django,django-admin,overriding,widget,Django,Django Admin,Overriding,Widget,我有一个自定义标记字段表单字段 class TagField(forms.CharField): def __init__(self, *args, **kwargs): super(TagField, self).__init__(*args, **kwargs) self.widget = forms.TextInput(attrs={'class':'tag_field'}) 如上所述,它使用一个TextInput表单字段小部件。但在管理,我想它显
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\u覆盖
hook,但它不适用于这种情况
管理员声明是:
class ProductAdmin(admin.ModelAdmin):
...
formfield_overrides = {
TagField: {'widget': admin.widgets.AdminTextareaWidget},
}
这对表单字段小部件没有影响,标记仍然使用TextInput小部件呈现
非常感谢您的帮助
--
omat尝试如下更改您的字段:
class TagField(forms.CharField):
def __init__(self, *args, **kwargs):
self.widget = forms.TextInput(attrs={'class':'tag_field'})
super(TagField, self).__init__(*args, **kwargs)
这将允许使用来自**kwargs
的小部件。否则,您的字段将始终使用form.TextInput
小部件。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)
此时您还可以覆盖queryset:要根据模型中的另一个字段过滤对象,例如(因为将选项限制为无法处理此问题)您可以通过扩展Django 1.2以来的ModelForm Meta类来覆盖字段小部件:
class ProductAdminForm(forms.ModelForm):
class Meta:
model = Product
widgets = {
'tags': admin.widgets.AdminTextareaWidget
}
class ProductAdmin(admin.ModelAdmin):
form = ProductAdminForm
对于特定字段,而不是我使用的字段类型:
Django 2.1.7
class ProjectAdminForm(forms.ModelForm):
类元:
模型=项目
字段='\uuuu所有\uuuu'
小部件={
'project_description':forms.Textarea(attrs={'cols':98})
}
class ProjectAdmin(admin.ModelAdmin):
表单=项目管理表单
谢谢,@MuratÇorlu我应用了更改,但现在所有标记字段都呈现为Textarea。查看django.forms.fields,我发现为字段指定默认小部件的正确方法是:class TagField(form.CharField):widget=forms.TextInput def widget_attrs(self,widget):return{'class':'tag_field'}您不必重写\uuuuu init\uuuuu
方法。试试这个。谢谢,但还是不走运。所有标记字段都显示为Textarea,在整个管理中,而不仅仅是ProductAdmin。这对我不起作用,您需要传递小部件的实例,而不是类。不过,该实例工作得很好。我通常会创建自定义的admi在admin.py中添加n个表单,而不要将它们与forms.py混合。这会减少其他开发人员的混淆,并将所有特定于管理的项保留在同一个.py文件中。Good point@MaestroFJP。我在较新的代码中就是这么做的。或者,如果您有非常复杂的表单,并且有很多表单,请使用forms/admin.py子模块。来自一个卑微的人的问题e新手:在这个例子中,'tags'
是什么?字段名-这是一个假设,即字段名的形式。从Django 1.8开始,您应该将字段='\uuuuuuu all\uuuuuu'
添加到元中。