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

标签 django django-admin overriding widget

我有一个自定义 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 Hook ,但它不适用于这种情况。

管理员声明是:

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

这对表单字段小部件没有影响,标签 仍然使用 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)

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

关于Django Admin - 覆盖自定义表单字段的小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3469979/

相关文章:

database - Django 数据库设计 : ManyToManyField when using Inlines

python - 在 Django Admin 中更改密码

java - 使用集合时覆盖的规则

node.js - 如何覆盖feathersjs默认服务方法

python - 限制出现在 Django 管理选择框中的值

javascript - 在 Django 表单中动态显示和隐藏字段

django - 在 Django 管理面板中动态显示和隐藏字段

msbuild - 覆盖 MSBuild 中的继承任务

python - 这个 Django 查询可以改进吗?

Javascript - 获取链接点击时间