web-dev-qa-db-ja.com

Django Admin:1つのモデルフィールドのみにカスタムウィジェットを使用する

モデルに DateTimeField フィールドがあります。 Django adminサイトでチェックボックスウィジェットとして表示したかった。これを行うために、カスタムフォームウィジェットを作成した。しかし、カスタムウィジェットをonlyこの1つのフィールド。

Django documentation は、特定のタイプのallフィールドにカスタムウィジェットを使用する方法を説明しています。

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

ただし、これは十分な粒度ではありません。 oneフィールドのみで変更したい。

58

ModelAdmin用のカスタムModelFormを作成し、次のように「ウィジェット」をMetaクラスに追加します。

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

class StopAdmin(admin.ModelAdmin):
  form = StopAdminForm

できた!

このドキュメントは、管理ドキュメントに記載されていない限り、ModelFormドキュメントに非直感的に配置されています。参照: モデルからのフォームの作成

120
Chris Pratt

adminmodel 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にはより良い解決策があります。

31

次のように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/

18
Andy Baker

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公式ドキュメント を参照してください

これが役立つことを願っています

4
Arya-2790306