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

oma*_*mat 28 django overriding widget 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'})
Run Code Online (Sandbox Code Playgroud)

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

管理声明是:

class ProductAdmin(admin.ModelAdmin):
    ...
    formfield_overrides = {
        TagField: {'widget': admin.widgets.AdminTextareaWidget},
    }
Run Code Online (Sandbox Code Playgroud)

这对表单字段小部件没有影响,tags仍然使用TextInput小部件进行呈现.

任何帮助深表感谢.

-
omat

Mat*_*kel 45

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()
Run Code Online (Sandbox Code Playgroud)

然后,在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)
Run Code Online (Sandbox Code Playgroud)

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

  • 我通常会在 admin.py 中创建自定义管理表单,而不是将它们与 forms.py 混合。这减少了其他开发人员的任何混淆,并将所有管理员特定项目保存在同一个 .py 文件中。 (2认同)

Mur*_*rlu 34

您可以通过扩展自Django 1.2以来的ModelForm Meta类来覆盖字段小部件:

class ProductAdminForm(forms.ModelForm):
    class Meta:
        model = Product
        widgets = {
            'tags': admin.widgets.AdminTextareaWidget
        }

class ProductAdmin(admin.ModelAdmin):
    form = ProductAdminForm
Run Code Online (Sandbox Code Playgroud)

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

  • 从Django 1.8开始,你应该将`fields ='__ all __'`添加到`Meta`.视频http://stackoverflow.com/a/28306347/1161025. (4认同)

C.K*_*.K. 7

对于特定字段而不是我使用的字段:

\n\n
\n

姜戈2.1.7

\n
\n\n
class ProjectAdminForm(forms.ModelForm):\n    class Meta:\n        model = Project\n        fields = \'__all__\'\n        widgets = {\n            \'project_description\': forms.Textarea(attrs={\'cols\': 98})\n        }\n
Run Code Online (Sandbox Code Playgroud)\n\n
class ProjectAdmin(admin.ModelAdmin):\n    form = ProjectAdminForm\n
Run Code Online (Sandbox Code Playgroud)\n\n

谢谢,@Murat \xc3\x87orlu

\n