Django的pipe理员:使用一个自定义的部件只有一个模型领域

我在我的模型中有一个DateTimeField字段。 我想在Djangopipe理站点中将其显示为一个checkbox小部件。 为此,我创build了一个自定义表单小部件。 但是,我不知道如何使用我的自定义小部件只有这一个领域。

Django文档解释了如何为特定types的所有字段使用自定义小部件:

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

虽然这不够精细。 我只想改变它只有一个领域。

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

 class StopAdminForm(forms.ModelForm): class Meta: model = Stop widgets = { 'approve_ts': ApproveStopWidget(), } fields = '__all__' class StopAdmin(admin.ModelAdmin): form = StopAdminForm 

完成!

这些文档是非常直观地放在ModelForm文档中的,没有提到pipe理员文档中提到的文档。 请参阅: 从模型创build表单

挖掘到pipe理 , 模型领域和表单域代码后,我相信唯一的方法来执行我想要的是通过创build一个自定义模型字段:

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 } } 

它完成了工作。

就目前而言,我不会回答这个问题,因为我有这样的习惯。 也许一些Django smartypants有更好的解决scheme。

像这样覆盖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/

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 

关于这个主题请参考Django官方文档

我希望这个能帮上忙