モデルに DateTimeField フィールドがあります。 Django adminサイトでチェックボックスウィジェットとして表示したかった。これを行うために、カスタムフォームウィジェットを作成した。しかし、カスタムウィジェットをonlyこの1つのフィールド。
Django documentation は、特定のタイプのallフィールドにカスタムウィジェットを使用する方法を説明しています。
class StopAdmin(admin.ModelAdmin):
formfield_overrides = {
models.DateTimeField: {'widget': ApproveStopWidget }
}
ただし、これは十分な粒度ではありません。 oneフィールドのみで変更したい。
ModelAdmin用のカスタムModelFormを作成し、次のように「ウィジェット」をMetaクラスに追加します。
class StopAdminForm(forms.ModelForm):
class Meta:
model = Stop
widgets = {
'approve_ts': ApproveStopWidget(),
}
fields = '__all__'
class StopAdmin(admin.ModelAdmin):
form = StopAdminForm
できた!
このドキュメントは、管理ドキュメントに記載されていない限り、ModelFormドキュメントに非直感的に配置されています。参照: モデルからのフォームの作成
admin 、 model field 、および form field のコードを掘り下げた後、私が望むことを実行する唯一の方法はカスタムを作成することだと思いますモデルフィールド:
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にはより良い解決策があります。
次のように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)
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公式ドキュメント を参照してください
これが役立つことを願っています