69

モデルにDateTimeFieldフィールドがあります。Django管理サイトにチェックボックスウィジェットとして表示したかったのです。これを行うために、カスタムフォームウィジェットを作成しました。ただし、この1つのフィールドのみにカスタムウィジェットを使用する方法がわかりません。

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

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

ただし、これは十分にきめ細かいものではありません。1つのフィールドだけを変更したい。

4

4 に答える 4

131

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

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

class StopAdmin(admin.ModelAdmin):
  form = StopAdminForm

終わり!

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

于 2011-03-10T17:42:13.307 に答える
36

管理者モデルフィールドフォームフィールドのコードを掘り下げた後、私が望むことを実行する唯一の方法は、カスタムモデルフィールドを作成することだと思います。

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

それは仕事を成し遂げます。

当たり前のことを見逃す癖があるので、とりあえず質問は未回答のままにしておきます。おそらく、一部のDjangosmartypantsにはより優れたソリューションがあります。

于 2010-11-16T02:09:50.323 に答える
25

次のように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/へのクレジット)

于 2016-06-07T10:34:19.093 に答える
5

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

これがお役に立てば幸いです

于 2013-09-18T09:29:38.117 に答える