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

6qqygrtg  于 2023-06-25  发布在  Go
关注(0)|答案(4)|浏览(92)

我有一个自定义的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钩子,但它不适用于这种情况。
admin声明为:

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

这对表单域小部件没有影响,tags仍然使用TextInput小部件呈现。
任何帮助都是非常感谢的。

奥马特

e5nqia27

e5nqia271#

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)

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

kwvwclae

kwvwclae2#

你可以通过扩展Django 1.2之后的ModelFormMeta类来覆盖字段小部件:

from django import forms
from django.contrib import admin

class ProductAdminForm(forms.ModelForm):
    class Meta:
        model = Product
        fields = '__all__'  # edit: django >= 1.8
        widgets = {
            'tags': admin.widgets.AdminTextareaWidget
        }

class ProductAdmin(admin.ModelAdmin):
    form = ProductAdminForm

https://docs.djangoproject.com/en/stable/topics/forms/modelforms/#overriding-the-default-fields

e4eetjau

e4eetjau3#

对于一个特定的字段,而不是我使用的一种字段:
简体中文

class ProjectAdminForm(forms.ModelForm):
    class Meta:
        model = Project
        fields = '__all__'
        widgets = {
            'project_description': forms.Textarea(attrs={'cols': 98})
        }
class ProjectAdmin(admin.ModelAdmin):
    form = ProjectAdminForm

谢谢,@穆拉特Çorlu

8xiog9wr

8xiog9wr4#

试着像这样改变你的领域:

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小部件。

相关问题