69

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

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

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

不过,这还不够细化。我只想为一个字段更改它。

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

在深入研究了adminmodel 字段form 字段代码之后,我相信执行我想要的唯一方法是创建一个自定义模型字段:

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 有更好的解决方案。

于 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 回答