Django Admin: 只对一个模型字段使用自定义小部件

在我的模型中有一个 日期时间字段字段。我想在 Django 管理站点中将其显示为一个复选框小部件。为此,我创建了一个自定义表单小部件。但是,我不知道如何使用我的自定义小部件 只有这一个字段。

姜戈文档解释了如何为某种类型的 所有字段使用自定义小部件:

class StopAdmin(admin.ModelAdmin):
formfield_overrides = {
models.DateTimeField: {'widget': ApproveStopWidget }
}

但是这个粒度还不够,我只想为 字段更改它。

57837 次浏览

在深入研究了 管理员模型场表单字段代码之后,我认为实现我想要的东西的唯一方法是创建一个自定义模型字段:

models.py

from django.db import models
from widgets import ApproveStopWidget


class ApproveStopModelField(models.DateTimeField):
pass


class Stop(models.model):
# Other fields
approve_ts = ApproveStopModelField('Approve place', null=True, blank=True)

admin.py

from widgets import ApproveStopWidget
from models import ApproveStopModelField


class StopAdmin(admin.ModelAdmin):
formfield_overrides = {
ApproveStopModelField: {'widget': ApproveStopWidget }
}

它能完成任务。

我暂时不回答这个问题,因为我习惯于忽略显而易见的事情。也许一些姜戈的聪明人有更好的解决办法。

为 ModelAdmin 创建一个自定义的 ModelForm,并将“ widgets”添加到它的 Meta 类中,如下所示:

class StopAdminForm(forms.ModelForm):
class Meta:
model = Stop
widgets = {
'field_name': ApproveStopWidget(),
}
fields = '__all__'


class StopAdmin(admin.ModelAdmin):
form = StopAdminForm

成交!

这方面的文档非直观地放置在 ModelForm 文档中,在管理文档中没有提到它。见: 从模型创建表单

Django 的 ModelAdmin.get _ changelist _ form (self、 request、 * * kwargs)可以解决 list _ editable 的问题

class StopAdminForm(forms.ModelForm):
class Meta:
model = Stop
widgets = {
'approve_ts': ApproveStopWidget(),
}


class StopAdmin(admin.ModelAdmin):
form = StopAdminForm


#just return the ModelForm class StopAdminForm
def get_changelist_form(self, request, **kwargs):
return StopAdminForm

请参阅 关于这个主题的官方文件

希望这个能帮上忙

像这样覆盖 formfield _ for _ dbfield:

class VehicleAdmin(admin.ModelAdmin):
search_fields = ["name", "colour"]


def formfield_for_dbfield(self, db_field, **kwargs):
if db_field.name == 'colour':
kwargs['widget'] = ColourChooserWidget
return super(VehicleAdmin, self).formfield_for_dbfield(db_field,**kwargs)

(信贷到 http://www.kryogenix.org/days/2008/03/28/overriding-a-single-field-in-the-django-admin-using-newforms-admin/)

您可以只为一个字段更改小部件,方法是将小部件分配给自定义表单中的一个字段,并将自定义表单分配给管理员,如下所示:

# "admin.py"


class ProductForm(forms.ModelForm):
class Meta:
model = Product
widgets = {
'price': PriceWidget(),
}
fields = '__all__'


@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
form = ProductForm