Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django Admin-覆盖自定义表单字段的小部件_Django_Django Admin_Overriding_Widget - Fatal编程技术网

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'
添加到
元中。